我是这个网站的新手,如果这个问题的格式看起来像垃圾,我深表歉意。
在IE7中,当我用原型的SELECT
添加Element.addMethods
方法,然后再次调用Element.addMethods时,我添加的方法不见了。
例:
<html>
<head>
<script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/prototype/1.7.0.0/prototype.js"></script>
<script type="text/javascript">
Element.addMethods(
'SELECT',
{
getSelected : function(elem){
elem = $(elem);
if(!elem.multiple){
return elem.options[elem.selectedIndex] ? $(elem.options[elem.selectedIndex]) : null;
}
return $A(elem.options).findAll(function(option){return option.selected;}).map(Element.extend);
}
}
);
Element.addMethods();
function displayResult(elem){
var selected = $(elem).getSelected();
if(Object.isArray(selected)){
var ret = '';
selected.each(function(optionElem){
ret += (ret ? ', ' : '') + option.innerHTML;
})
alert('['+ret+']');
}
else {
alert(selected.innerHTML);
}
}
</script>
</head>
<body>
<form>
Select your favorite fruit:
<select id="mySelect">
<option>Apple</option>
<option>Orange</option>
<option>Pineapple</option>
</select>
</form>
<input type='button' value='Display' onclick='displayResult("mySelect")'>
</body>
</html>
我意识到在此示例中,对Element.addMethods()的调用是多余的,但它来自我无权更新的库。但是,我确实可以控制
SELECT
方法的添加方式,而不是在执行代码的位置进行控制。关于如何防止这种方法删除标记特定的方法(是否使用其他不错的浏览器),您有何想法?
最佳答案
显然,不应在没有参数的情况下调用Element.addMethods
,请参见Element.addMethods documentation。 Prototype本身似乎在内部使用它来最初添加Prototype扩展,但是再次调用它似乎可以在IE中恢复新的原型,从而删除您自己的所有扩展。
我看到两个可能的解决方法:
如果您有权访问Element.addMethods();
行,请将其删除或替换为
Element.addMethods({});
在您的代码中修补
Element.addMethods
可以防止空调用,例如通过在getSelected
定义之前或之后(但在Element.addMethods();
之前)插入以下重新定义:Element.addMethods = Element.addMethods.wrap(function(callOriginal) {
if (arguments.length == 1) {
callOriginal.call(Element, {});
} else {
var args = $A(arguments);
args.shift();
callOriginal.apply(Element, args);
}
});