【问题标题】:Remove event listener added with eval移除使用 eval 添加的事件监听器
【发布时间】:2010-07-11 21:19:45
【问题描述】:

我会尽力解释...

我有一个页面,我们称之为pageA。当在该页面上单击一个按钮时,会发出一个 ajax 请求,并且返回数据是 eval()'d。该数据显然包含 javascript 代码。此代码可能包含在对其进行评估时添加到 pageA 的事件侦听器。例如 jquery $('body').click() 之类的东西。

当再次单击 pageA 上的按钮时,是否有一个函数或某些东西可以删除该 eval 上添加的任何和所有事件侦听器和数据。

我在评估数据之前将从 ajax 调用返回的所有数据捕获到一个变量中,那么有没有办法只做 $(data).remove() 并让所有事件侦听器和数据神奇地消失?

使用 eval 数据,它并没有真正添加到页面本身,我可以在页面上删除文本并解决所有问题,但事件侦听器肯定会保留。

有什么想法吗?

【问题讨论】:

    标签: javascript eval


    【解决方案1】:

    我将放弃关于 eval 的邪恶的讲座,并建议您尝试在 jQuery 中为您的事件命名空间。

    http://docs.jquery.com/Namespaced_Events

    例如,数据中的代码是否可以使用命名空间添加所有新事件:

    $(node).bind("click.myNameSpace", fn);
    

    当你想删除它时,你只需要$(node).unbind("click.myNameSpace"),当然,这是假设你知道它们被添加到了哪些元素。如果您不知道添加的事件类型,您也可以执行$(node).unbind(".myNameSpace"),它将删除您命名空间下的所有事件。

    【讨论】:

    • 如果你知道更好的方法,我会很高兴听到它。我已经尝试将脚本附加到头部,但脚本标签永远不会起作用,我自己也不是特别喜欢 eval ......所以,任何建议都会被听到。
    • @Senica 附加脚本不会比 eval 好多少。它们既慢又可利用。这个想法是尝试发送数据而不是可执行代码。
    • 对,不幸的是,这在我的情况下不起作用。这是针对管理员和插件的。插件代码是正在评估的。我不想限制可以通过插件完成的操作,我只需要能够在某个时候将其删除。
    • @Senica 我认为事件命名空间将是可行的方法——如果你可以强迫自己或任何创作插件的人遵循该模式。添加事件:$(node).bind("eventtype.pluginname", fn)。删除所有事件:$(body).children().unbind(".pluginname")。这可能有效,也可能无效(它也可能有点慢,但我假设它不会经常发生),我的 jQuery 有点生疏,但你明白了。
    【解决方案2】:

    在您 eval 返回的 javascript 之前复制特定按钮上所有当前附加的事件处理程序可能会更容易。然后取消绑定所有事件(eval 可以添加额外的处理程序)并重新绑定之前的事件。

    编辑:看起来有人已经有类似的问题:jQuery: Unbind event handlers to bind them again later(尽管它使用 jQuery)。

    我不禁要问,你对返回的 JS 没有控制权吗?因为如果这样做,最好确保从一开始就不会发送恶意内容。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-07-22
      • 1970-01-01
      • 1970-01-01
      • 2018-02-04
      • 1970-01-01
      • 1970-01-01
      • 2011-12-30
      • 1970-01-01
      相关资源
      最近更新 更多