JavaScript 方法一个有效,另一个无效
JavaScript methods one works the other doesn't
为什么会这样?
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" >
$( document ).ready(function() {
$('#listF').on('change', function(){
var n = this.getAttribute('size'),
i = this.selectedIndex,
l = this.options.length;
this.selectedIndex = Math.min(l-1,i+n/2|0);
this.selectedIndex = Math.max(0,i+1-n/2|0);
this.selectedIndex = i;
});
});
</script>
<select name="" id="listF" size="5">
<option value="01">001</option>
<option value="02">002</option>
<option value="03">003</option>
<option value="04">004</option>
<option value="05">005</option>
<option value="06">006</option>
<option value="07">007</option>
<option value="08">008</option>
<option value="09">009</option>
<option value="10">010</option>
</select>
这行不通?
<script type="text/javascript" src="//ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
<script type="text/javascript" >
function centerNumber(){
var n = 5,
i = this.selectedIndex,
l = this.options.length;
this.selectedIndex = Math.min(l-1,i+n/2|0);
this.selectedIndex = Math.max(0,i+1-n/2|0);
this.selectedIndex = i;
}
</script>
<select name="" id="listF" size="5" onchange="centerNumber()">
<option value="01">001</option>
<option value="02">002</option>
<option value="03">003</option>
<option value="04">004</option>
<option value="05">005</option>
<option value="06">006</option>
<option value="07">007</option>
<option value="08">008</option>
<option value="09">009</option>
<option value="10">010</option>
我更喜欢第二种方法,因为它可以使用很多次,而不仅仅是一种。在第一种方法中,您必须在每次需要更改时复制/粘贴代码。第二种方法似乎更干净。
我的意思是它不起作用的是它不居中。JavaScript似乎无法工作。
this
的值取决于函数的调用方式。
在第一个示例中,传递给on
的匿名函数表达式是事件处理程序,因此当调用它时,它是在元素的上下文中。
在第二个示例中,onchange
是事件处理程序(根本不使用 this
),它调用没有上下文的centerNumber
(因此它获得 window
的默认上下文)。
我更喜欢第二种方法
不要。在HTML中嵌入JS并使用全局变量是我们在90年代的做法。将关注点和代码打包到狭窄的范围内以避免冲突要干净得多。
因为它可以使用很多次,而不仅仅是一次。在第一种方法中,您必须在每次需要更改时复制/粘贴代码。
事实并非如此。只需先定义一个函数并重用它。
function someFunction (event) {
/* do stuff */
};
jQuery('.someElements').on('change', someFunction);
jQuery('#anElement').on('click', someFunction);
您不应该使用第二种方法 - 内联 DOM0 事件处理程序容易出错且过时。 您遇到的具体问题是您没有将正确的this
传递给居中函数。
一定要将处理程序放在一个单独的命名函数中,以便它可以在多个元素上重用(就像你在第二个代码中所做的那样),但你应该使用 jQuery 来注册它:
$('#listF').on('change', centerNumber);
第二个脚本不起作用,因为this
不指向元素。
在事件处理程序中,this
是元素,但随后调用函数,因此丢失了上下文。可以使用 call
方法指定函数的上下文:
onchange="centerNumber.call(this)"
您也可以将第一种方法用于多个元素,只需在选择器中指定它们即可。例:
$('#listA,#listB,#listC,#listD,#listE,#listF').on('change', function(){
使用类来定位元素可以使其更加容易,因为您可以在多个元素上设置相同的类。
如果你调用 centerNumber() 方法以 'this' 作为参数,那么这将起作用。 例如,
<select name="" id="listF" size="5" onchange="centerNumber(this)">
<script type="text/javascript" >
function centerNumber(which){
var n = 5,
i = which.selectedIndex,
l = which.options.length;
which.selectedIndex = Math.min(l-1,i+n/2|0);
which.selectedIndex = Math.max(0,i+1-n/2|0);
which.selectedIndex = i;
}
</script>
很多好的建议。你也可以在没有jQuery(或任何库)的情况下做到这一点,一些选项:
// Things that work in all browsers
window.onload = function() {
document.getElementById('listF').onchange = centerNumber;
}
// Place in a script element just before the closing body tag
document.getElementById('listF').onchange = centerNumber;
// Things that work in most, but not all, browsers
// IE 8 and lower don't support addEventListener
// There are plenty of cross-browser alternatives
window.onload = function() {
document.getElementById('listF').addEventListener('change', centerNumber, false);
}
SO 上有很多关于附加事件侦听器的问题和答案。没过多久,内联听众就会变得头疼,但对于一个简单的网站来说,它们就很好了。
- Javascript——为什么一个document.getElementById()有效,而另一个无效
- 为什么传入的参数在一个地方有效,而在另一个地方不起作用
- 如何仅在另一个 js 脚本有效时才运行 js 脚本
- JavaScript 方法一个有效,另一个无效
- 将 Base64 编码的图像加密为另一个有效的 Base64 编码图像
- JQuery - Parsexml:一个页面上的有效xml,另一个页面上无效的xml,两个页面上的相同xml
- 如何有效地检查路径字符串是否是 jQuery 中另一个路径字符串的子项
- getElementById在一个环境中有效,但在另一个环境下无效
- 查找不包含在另一个元素中的元素的有效方法
- 指向URL的Javascript绝对路径在一个页面上有效,但在另一个页面创建ajax错误消息
- 有人能告诉我为什么其中一个有效,另一个无效吗
- 为什么这个js幻灯片在一个安装上有效,而在另一个安装中无效
- 调用函数在一个实例中有效,但在另一个实例则无效
- 常量在一个服务中未定义,但在另一个服务中有效
- 当登录有效时重定向到另一个页面,否则停留在同一页面上
- 如何有效地检查数组中的任何子字符串是否包含在另一个字符串中
- 从另一个元素创建一个React元素在ReactJs中是有效的
- Processing.getInstanceById (id);对一个函数有效,对另一个函数未定义
- 在ajax调用中包含另一个php文件是有效的,但javascript文件不起作用;t负载
- 为什么我的解决方案有效,而另一个解决方案无效