【问题标题】:Laravel 5.2 add variable to request using jQueryLaravel 5.2 使用 jQuery 向请求添加变量
【发布时间】:2016-01-31 04:03:15
【问题描述】:

编辑:这可以通过使用 jQuery 在客户端的 Laravel cookie 中添加一个变量来完成吗?我了解 Cookie 在 GET 期间附加到请求中?


是否可以在执行GET 路由请求之前使用 jQuery 向 Laravel 5.2 中的$request 容器添加变量?

基本上,我正在尝试将值传递给GET 请求,并将其作为参数保留在 URL 之外(并且对用户隐藏)。

我的 HTML 本质上是一个菜单:

<ul class="sidebar-nav nav-pills nav-stacked " id="menu">
    <li id="menu-1">
        <a href="app.url/1">Menu 1</a>
    </li>
    <li id="menu-2">
        <a href="app.url/2">Menu 2</a>
    </li>
    <li>.....</li>
</ul>

当a链接被点击时,我想截取这个并添加

menuState = 'state';

到$request 容器,然后允许点击事件路由到href 目的地。

现在在 Laravel 端,我应该能够访问它的值:

$request->input('menuState');

这是否可能在本质上是GET 请求,因此没有发布表单?

这是添加 URL 变量的示例

<a onclick="addURL(this)" href="app.url/1">Menu 1</a>

function addURL(element)
{
    $(element).attr('href', function() {
        return this.href + '&menuState=10';
    });
}

这个可以吗?

<a onclick="addURL(this)" href="app.url/1">Menu 1</a>

function addURL(element)
{
   ---> ADD menuState = value to $request container, then continue with GET request
}

【问题讨论】:

  • 如果您不想显示查询字符串,请使用 POST 方法。通过 JS 添加字段值:document.myformname.fieldname = fieldvalue 如果您想使用 javascript 提交,请执行 document.myformname.submit()。
  • 嗨@JoeS,明白。但是我试图通过 GET 来做到这一点,因为我本身并没有发布表单,而是使用 GET 请求激活链接重定向。我试图避免手动将请求转换为 POST,因为它会混淆应用程序路由。这是应用程序的主菜单。
  • 所以这是以 rest 样式和 HTTP GET 动词完成的,这意味着您可以执行 /url/id/action/action2..etc。由于您使用的是 laravel,因此您可以阅读 Routing 文档来实现它。同样,我不知道您可以使用 GET 方法隐藏它。
  • 好的,我猜你想突出显示选定的菜单?这应该在带有条件检查的实际控制器或视图文件中完成,或者在带有可能与选中或未选中状态配对的菜单名称的数组中完成。就像选择了菜单一样,然后添加一个类 attr 或其他东西。希望这更有帮助。顺便说一句,你刚刚问了一个经典的 XY 问题 :) 呵呵
  • 嗨@JoeS 我正在尝试传递菜单的状态(打开/关闭)并避免在每条路线中将其作为变量。 URL 看起来也很丑。现在我看到 $request 容器对应用程序可用,而不管路由是如何调用的(GET、PUT 等)。它包含一堆数据。如何添加到此数据?我误解了什么是可能的吗?

标签: javascript php jquery laravel-5.2


【解决方案1】:

好的,我将尝试为您的问题提供更完整的解决方案。

正如您所指出的,您的菜单 url 应该看起来更好;他们应该有文字而不是数字(这对搜索引擎优化也有好处)。 &lt;a&gt; href attr 可以设置为相对 URL,如 href='home' 或 href = 'about'。

现在的问题是如何传递所有页面的菜单状态。在这种情况下,您可能不想使用 $request 变量作为菜单状态,我认为应该为不同的页面预先确定。控制器应该设置一些菜单状态变量数组,其中包含每个菜单的开/关。 (或者只是一个设置为哪个菜单打开的字符串,但是您需要遍历菜单并进行条件检查,您的选择)。

在这种情况下,您可能可以为菜单使用视图编辑器,或者如果您很懒惰,只需在 serviceProvider 中使用 view()->share。检查必要的条件并传递结果。在这种情况下,我认为菜单状态应该从使用 Route::url() 的脚本中单独访问的 url 中清除。

编辑: 行。所以最后我明白了在那次讨论之后发生了什么。这是我的建议。我不会费心尝试保持菜单状态。大多数网站都有悬停效果,菜单只是在鼠标悬停时展开,然后您单击菜单转到另一个页面,您希望在该页面上查看更多内容,因此应该折叠菜单。如果用户真的希望选择将菜单扩展为默认选项,请在他们的个人资料中进行首选项设置。但是,请保留切换 JavaScript,因为他们有时可能仍想折叠菜单 :)

【讨论】:

  • 啊,对不起@JoesS 但要么你误解了我,要么我误解了你!我有一个可以滑动打开和关闭的菜单。这是我想通过 GET 传递回应用程序的状态。我已经命名了所有路由并以这种方式在我的代码中引用这些路由。我有一个与页面标题、css 代码、slug 等相关的路由表。说得通?您将如何通过 get 传递 menu=open 数据,避免使用 url 变量,也不是 Laravel 方式(我不希望在每条路线上都使用它)以及 AJAX,因为我不希望我的服务器 ping 菜单打开/关闭。如果这是不可能的,那么回到绘图板。谢谢
  • 好的。我要问你菜单状态是怎么确定的。
  • 嗨@JoeS,菜单由jQuery激活以打开或关闭。我只希望下一页加载(发布或获取)在此状态下加载菜单,而不通过 URL 可见,并且每次单击时都没有 Ajax 通知状态更改。我还想避免在客户端使用 sessionStorage。菜单是动画的,如果在页面加载时切换,那么您会看到它这样做。我将在下一个页面加载之前更改 PHP 中的菜单状态。
  • 这是一个菜单操作示例 (seegatesite.com/bootstrap/simple_sidebar_menu.html)
  • 我会在客户端使用本地存储。很确定这就是它的完成方式,除非您希望状态在下次登录时保持不变,否则您需要将其存储在缓存文件或数据库中。 (另一种方式是 AJAX 来修改会话变量。)您需要能够确定某处的状态。 GET 方法读取 url。我想我可能已经访问了一些带有 ?query 字符串的站点,以获取类似的内容。这不是那么糟糕,哈哈。我想说本地存储是这里的方法。
【解决方案2】:

IMO 最简单的方法是在点击 a 后防止链接重定向并添加点击事件以捕获此点击,然后使用 jquery $.get() 方法添加您想要的参数并发送您的请求:

$('#menu').on('click', 'a', funtion(e){
     e.pereventDefault(); //prevent link redirection after click

     $.get($(this).attr('href'), {menuState: 'state'}, function(response){
         //response variable contain response from laravel controler 
     })
});

希望这会有所帮助。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-23
    • 1970-01-01
    • 2017-05-12
    • 2016-11-07
    • 1970-01-01
    • 1970-01-01
    • 2017-04-23
    • 1970-01-01
    相关资源
    最近更新 更多