【问题标题】:How to handle situations in which the DOM changes overwriting some variables?如何处理 DOM 更改覆盖某些变量的情况?
【发布时间】:2012-12-05 15:01:29
【问题描述】:

我正在使用 Ruby on Rails、jQuery v1.8.3 和 jQuery UI v1.9.2。在视图文件中,我以这种方式呈现部分模板:

<%= render :partial => 'template_name', :locals => { :div_id => 'div_id1' } %>

相关的template_name 文件包含以下内容:

<script type="text/javascript">
  var item = $('#<%= div_id %>')

  alert(item.selector) // Display #div_id1
</script>

在同一页面上,通过 AJAX 请求,我检索并添加到 DOM 相同的部分模板,但使用 :locals =&gt; { :div_id =&gt; 'div_id2' }

<script type="text/javascript">
  var item = $('#<%= div_id %>')

  alert(item.selector) // Display #div_id2
</script>

进行上述操作, AJAX 请求之后,我“丢失”了对#div_id1 的引用,因为item#div_id2 相关。

我应该如何处理这种情况以避免“覆盖”变量?如何“隔离”(可能是命名空间或使用一些 jQuery 功能)这些变量?

【问题讨论】:

  • 真正的问题是:你使用的是全局变量
  • 我会避免尝试将客户端 JavaScript 与服务器端输出混合在一起。
  • @apneadiving - 我应该如何使这些变量成为本地变量?
  • 无论你在做什么,你都应该确定它的范围,它确实是每个可靠的 js 架构的基础。
  • @Explosion Pills - 在我的情况下,应如何避免将客户端 JavaScript 与服务器端输出混合?

标签: javascript jquery ruby-on-rails ajax rendering


【解决方案1】:

如果代码 sn-ps 是自包含的,您应该能够将代码移动到私有范围内。

<script type="text/javascript">
    (function(){
        var item = $('#<%= div_id %>');
        alert(item.selector); // Display #div_id2
    })();
</script>

虽然我不同意让服务器端代码生成基于 javascript 的 ui 小部件。

【讨论】:

  • :虽然我不同意让服务器端代码生成基于 javascript 的 ui 小部件。 :有什么方法可以避免这种情况?
  • 发布更多关于你的代码/视图的信息,并解释你想要做什么。我猜我们可以帮你重构
  • @user12882 这在很大程度上取决于您的应用程序结构。据我们所知,您可能会被编码到一个角落,这是您唯一的选择。
  • @MrYoshiji - 正如我在问题中解释的那样,在同一页面中,我尝试对同一个部分模板进行多次 AJAX 渲染,但我遇到的问题似乎与这些模板中包含的 JavaScript 变量的范围有关.
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-11-01
  • 1970-01-01
  • 2018-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多