Javascript 为什么我在Jquery中选择的方法切换不起作用? 问题
我刚开始学习javascript。我试图以一种更模块化的方式复制一段工作代码。它帮助我保持事物的整洁,并且更好地理解它 我确信有更好的高效或简洁的方法来实现代码的功能,所以请女士们/先生们不要客气,你可以省点力气。这里的重点是通过玩代码来学习我还不理解的东西 代码的作用是什么 它创建了该方法的替代方法 然后可以按以下方式使用$'foo h2'。mytoggleplus,减号 下面是原始代码: 以下是我之前代码的版本: 问题 为什么原始版本使用 每个人把这个还给我 而不是每个都退回$1美元 注意:我不能在我的版本上使用此选项,否则它将返回一个错误:uncaughttypeerror:Object[Object global]没有“each”方法 不是每个都是jQuery方法吗 据我所知,在使用它时,可以对其调用DOM方法,但不能调用jQuery方法。反之亦然。 为什么我的版本不起作用?我错过了什么 注意:我没有错误,所以调试起来比较困难。Javascript 为什么我在Jquery中选择的方法切换不起作用? 问题,javascript,jquery,dom,toggle,this,Javascript,Jquery,Dom,Toggle,This,我刚开始学习javascript。我试图以一种更模块化的方式复制一段工作代码。它帮助我保持事物的整洁,并且更好地理解它 我确信有更好的高效或简洁的方法来实现代码的功能,所以请女士们/先生们不要客气,你可以省点力气。这里的重点是通过玩代码来学习我还不理解的东西 代码的作用是什么 它创建了该方法的替代方法 然后可以按以下方式使用$'foo h2'。mytoggleplus,减号 下面是原始代码: 以下是我之前代码的版本: 问题 为什么原始版本使用 每个人把这个还给我 而不是每个都退回$1美元 注意:
当您将函数分配给$.fn时,它将在jQuery的上下文中执行,因此这是一个jQuery对象。函数很可能在窗口的上下文中执行。如果将最后一行更改为此,则其工作原理应完全相同:
$.fn.clicktoggle = call_a_or_b(a,b);
在plugin对象中,它指的是启动插件的jQuery包装器对象,而不是其他方法中的dom对象
因为这是jQuery包装器对象。每个都是可用的
您的实现中存在多个问题
当您调用call_a_或_b时,您没有将执行上下文传递给该方法,因此该方法中的内容引用窗口对象
根据经验,要在jQuery中启用链接,您需要返回jQuery包装器,但您没有这样做
替代方法存在与关闭和调用相关的问题
试一试
演示:他们使用这个而不是$this,因为它已经具有jquery对象的功能范围,因此不需要被jquery对象包装来回答您的1和2,您读过吗?该值的设置取决于函数的调用方式,它不是自动的,并且始终是DOM元素。在插件的情况下,它将是调用插件方法的jQuery集合。谢谢大家。我确实知道这一点,但由于对闭包的理解不好,我感到困惑。现在一切都好了。首先,谢谢你。迅速的答复给我留下了深刻的印象。您帮助我专注于了解您的解决方案所需的内容。看到有这么多令人惊叹的人,我感到非常振奋。谢谢你的尝试,但这个答案并不完全正确。更改最后一行不会使代码正常工作。请记住,我需要传递参数,以便首先使用mytoggle方法调用_a_或_b。即使我不需要这样做,它仍然不起作用——然后我需要将执行上下文传递给我相信的备选方法。请参考@arun答案。
function call_a_or_b (a,b) {
var clicked = false;
function alternate (a,b) {
if (clicked) {
clicked = false;
return a.apply(this, arguments);
}
else {
clicked = true;
return b.apply(this, arguments);
}
} // end function alternate
return $(this).each(function () {$(this).click(alternate(a,b))});
} //end function call_a_or_b
$.fn.clicktoggle = function(a,b) { call_a_or_b(a,b); };
$.fn.clicktoggle = call_a_or_b(a,b);
(function ($) {
function call_a_or_b(a, b) {
//for each matched element the clicked variable should be a closure one, so needed to rearrage it a bit
function alternate(el) {
var clicked = true;
$(this).click(function () {
if (clicked) {
clicked = false;
return a.apply(this, arguments);
} else {
clicked = true;
return b.apply(this, arguments);
}
})
} // end function alternate
return $(this).each(alternate);
} //end function call_a_or_b
$.fn.clicktoggle = function (a, b) {
//call the method with the current execution context and return the value returned fromit
return call_a_or_b.apply(this, arguments);
};
})(jQuery);