- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我确信我以错误的方式问了这个问题。我正在尝试将诸如 onClick="someFunc(arg1,arg2...)"
之类的字符串传递给 JavaScript 解析器。
解析器应该为 someFunc 创建一个带有参数(arg1、arg2 等)的 onClick 事件。
我的问题是,当文本通过解析器传递时,保存 someFunc 字符串名称的变量的范围将被向下传递,以便附加事件全部注册为最后声明的字符串。
在下面的代码中,attributes._onClick 可以是字符串 'onClick="someFunc(arg1,arg2);"对于一个元素,后跟 'onClick="otherFunc(argA,argB);"当解析器在字符串中移动时获取另一个元素。
浏览器(Firefox V14.01)中的输出具有始终注册为 otherFunc 的事件函数。因此,闭包中的 f_name 不会作为变量进行计算,而只是注册为在解析整个 block 的过程中声明的 f_name 的最后一个值。
我对范围的熟悉程度还不够,我需要了解这一点。有谁知道我可以以这种方式附加事件的方法(我试图避免在解析器之外添加事件)?
temp = attributes._onClick ;
var x = 0 ;
var f_name,f_args ;
while(temp[x] != '') {
temp[x] = temp[x].replace(')','').split('(') ;//remove paranthesis and separate func name from args
f_name = temp[x][0] ;
f_args = temp[x][1].split(',') ;//turn string of args into array
el.onclick = function() { window[f_name].apply(el,f_args) ; }
x++ ;
}
最佳答案
您遇到了 JavaScript 中的一个陷阱,该陷阱在某些时候以各种不同的方式导致几乎每个人都遇到同样的问题。
变量“f_name”在您创建的所有函数之间共享。也就是说,虽然循环的每次迭代都会创建一个新函数,但只有一个“f_name”。因此,所有函数都会看到相同的值,即上次迭代时的值。
有几个相关的解决方案。一种方法是将建立事件处理程序的语句包装在另一个匿名函数中,您可以立即调用该函数。这将允许您创建“f_name”的副本,供一个处理程序专用。
el.onclick = function(name) {
return function() { window[name].apply(el,f_args) ; };
}(f_name);
有趣的是,这个问题在 SO 上可能有数百种变体。
关于Javascript:从字符串附加事件,在闭包中评估变量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11746120/
我在一个简单的 GTK 应用程序中有两个小部件: extern crate gdk; extern crate gtk; use super::desktop_entry::DesktopEntry;
我想做这样的事情: const vegetableColors = {corn: 'yellow', peas: 'green'}; const {*} = vegetableColors; cons
该属性它存储在 gradle 中的什么位置? subprojects { println it.class.name // DefaultProject_Decorated depen
我想在 jQuery 闭包中看到窗口属性“otherName”描述符。但 进入 jQuery 闭包 'otherName' 描述符显示未定义,我认为可能 是 getOwnPropertyDescrip
我曾经看过 Douglas Crockford 的一次演讲,在 javascript 的上下文中,他提到将 secret 存储在闭包中可能很有用。 我想这可以在 Java 中像这样天真地实现: pub
我很难理解 Swift 中闭包中真正发生的事情,希望有人能帮助我理解。 class MyClass { func printWhatever(words: String) {
我有两个 3 表:用户、个人资料、friend_request $my_profile_id变量存储用户个人资料ID的值 $my_user_id = Auth::user()->id; $my_pro
我正在尝试通过使用 GLFW 的包装来学习 Swift GLFW 允许添加错误回调: GLFWAPI GLFWerrorfun glfwSetErrorCallback(GLFWerrorfun cb
我是一名优秀的程序员,十分优秀!