【发布时间】:2011-08-15 16:12:30
【问题描述】:
简单回答:
我的代码库使用的 jQuery 库已过期。
如果您是最新的,请尝试以下操作:
通过未缩小版本的 jQuery 查看问题是否在库中(10 次中有 9 次可能不会)
当一切都失败时,只需编写一个纯javascript解决方案。
有时,当我使用 jQuery 在 javscript 中编写“类”时,jQuery 将无法正常运行。例如,今天我在输入选择上执行以下操作:
$(this).val(newValue);
这在 jFiddle 中工作得很好,但在我的项目中不起作用(两者都有 0 个脚本错误)。我试图尽可能地隔离代码,但无济于事,我无法让它工作。
对此的“解决方案”是直接编写 javascript 来设置值,它工作得很好。
我不是 jQuery 大师,但这不是我第一次在 jQuery“失败”时编写直接的 javascript 解决方案。有没有 jQuery 大师知道为什么会发生这样的事情?有没有一种我不知道的调试 jQuery 的方法?有没有其他人在使用 jQuery 时遇到过这些类型的问题?如果有,你有解决办法吗?
更新:
2011 年 8 月 25 日
我下载了最新版本的 jQuery 库并逐步浏览它,但发现该错误可能已在 jQuery 1.4.4 和 1.6.2 之间解决。我没有意识到处理大部分 javascript 的人并没有让 jQuery 库保持最新。在逐步浏览 jQuery 1.4.4 库后,似乎 jQuery 出于某种原因无法找到我的选择器,因此从未设置该值。这个问题已经在1.6.2中解决了......
本周课程... 让您的 jQuery 库保持最新状态,并在事情不匹配时验证您的高级开发人员的声明。
-
我选择了我所做的答案,因为它是唯一真正帮助我诊断问题根源的答案。虽然单步执行未缩小版的 jQuery 是一个非常简单的解决方案,但实际上我应该在发布这个问题之前就这样做。稍后我将发布我的发现,说明为什么它不起作用。
2011 年 8 月 24 日
我同意用户 Sohnee 的观点,即使用重复的“名称”并不是坏习惯,而且在某些地方您确实需要它。
我觉得很愚蠢,因为发布的代码已经错误了将近一周了。我已经更新了代码。我将 init 函数移至公共范围。
2011 年 8 月 22 日
虽然我对问题的核心在于重名感到部分满意,但我需要知道为什么重名不好?
我知道在处理输入/css/等时,您通常除了 ID 是唯一的,类来表示组。我认为没有关于名称的任何规则,但如果有人可以向我解释为什么重复名称是不好的做法,我会考虑这个问题的答案。
2011 年 8 月 16 日
至于目前的答案,我不认为这是一个冲突。 jQuery 工作得很好。绑定正在触发,导致在两个实现中调用函数。
问题线是
$(overrideSelector).each(
function(){
$(this).val(newVal);
}
);
例如,如果我在 .each() 中控制台输出 newVal,它的值将是让我们说“A”。
然后,如果我控制台注销$(this).val(),它将是“B”。然后运行$(this).val(newVal);。之后,如果我做一个$(this).val() 的控制台日志,它仍然是'B'。
在 cmets 中,有人提到我可能用错了 this 这个词。这两个都在 Chrome 的控制台上返回了 0 个 javascript 错误。我将给出以下代码 sn-p 是什么问题。我会写原来的,然后用javascript替换它。
我知道名字是一样的,但没关系。我正在处理的页面是一个巨大的表单,克隆的选择只是为了让用户不必滚动回表单的另一部分。
HTML:
<div id='overrideHolder'>
</div>
<select name='mySelect'>
<option value='A'>A</option>
<option value='B'>B</option>
</select>
jQuery(这不工作):
var someClass = (function(){
var overrideSelector = '[name="mySelect"]';
...
return{
init : function(){
$(overrideSelector).clone().appendTo('#overrideHolder');
$(overrideSelector).each(
function(){
$(this).bind(
'change',
{},
function(){
someClass.overrideTryAgain(this);
}
);
}
);
}
overrideTryAgain : function(element){
var newVal = $(element).val();
$(overrideSelector).each(
function(){
$(this).val(newVal);
}
);
...
},
...
}
})();
$(document).ready(function(){
someClass.init();
}
Javascript(可行):
var someClass : (function(){
var overrideSelector = '[name="mySelect"]';
...
return{
init : function(){
$(overrideSelector).clone().appendTo('#overrideHolder');
$(overrideSelector).each(
function(){
$(this).bind(
'change',
{},
function(){
someClass.overrideTryAgain(this);
}
);
}
);
}
overrideTryAgain : function(element){
// NOTE: Using javascript instead of jQuery because jQuery was not duplicating the selected value properly
var newValue = $(element).get(0);
newValue = newValue.selectedIndex;
$(overrideSelector).each(
function(){
var currentSelect = $(this).get(0);
currentSelect.options[newValue].selected = true;
}
);
...
},
...
}
})();
...
$(document).ready(function(){
someClass.init();
}
【问题讨论】:
-
发布一些不起作用的代码,人们可以帮助你。
-
轶事:我已经编写了大量的 jQuery 和 javascript,并维护了一个基于 jQuery 的大型应用程序,只有当你遇到编码错误时才会停止工作。
-
您可能错误地使用了 this 关键字。您能否向我们展示您尝试运行此代码的上下文?
-
我同意 JamieC,它总是以一些编码错误而不是 jquery 结束
-
我支持 JamieC 和 Joseph Silber 的 cmets
标签: php javascript jquery html