基本上,我想做的是向 View 中的每一行迭代添加一行javascript代码。

在Drupal 6中,这曾经是通过Views Custom Field完成的,该字段现已集成到Drupal 7中。

当我尝试使用“全局:自定义文本”字段时,它会删除我的脚本标签。

有任何想法吗?

请注意:我不想使用drupal_add_js,因为它需要动态插入,并且我不希望内联使用(困惑)。将基于提供的JS弹出一个独特的工具提示,我需要实际的行ID。

在此先感谢!

最佳答案

在Twitter上进行了回复,但是为了其他遇到相同情况的人的利益(并且为了澄清起见),我认为我会在这里重新发布。

通常,我不建议使用views_php-启用/使用已经是discussed at length的PHP过滤器存在许多弊端,当您确实不需要它时,它会增加另一个模块的膨胀。在这种情况下,您仍然可以在预处理函数中使用drupal_add_js()并使事情保持动态。

简而言之,您具有将同一事件绑定(bind)到的元素列表。立即想到Event delegation作为可能的解决方案。现在,您有一个用于父容器的事件处理程序,而不是n个事件处理程序,这将使您的页面更具响应性。您不需要jQuery,但如果您愿意使用 .delegate()

至于如何从这个外部JS文件中获取ID,很简单:确保它在您要获取的源标记中。假设您要查找行ID,通常可以在每行的“views-row-N”类中找到它。否则,您将需要通过其他方式将class-id添加到模板中。在目标元素(您的行,与父元素内的.views-row匹配的元素)的事件处理程序内,从您要使用的类中解析ID,并根据您在其中找到的值执行脚本的其余部分。

这种方法有很多好处:减少了一个模块,减少了许多安全隐患,您的JS集中在一个地方,绑定(bind)了更少的事件处理程序,标记更轻松,更易于阅读,并且事件委托(delegate)意味着即使以后由于某种原因将元素动态添加到DOM中,该技术也仍然有效。至于细节,这将有助于准确了解您打算对弹出窗口执行的操作。是否正在对另一个节点进行AJAX调用?它是根据列表中的位置来做什么吗?我很乐意从那里澄清我的答案。

07-24 16:31
查看更多