我是这个网站的新用户,所以如果这个问题的格式看起来像垃圾,我道歉。
在IE7中,当我使用Prototype的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
方法的添加方式,而不是执行代码执行的位置。
有关如何防止这种方法删除特定于标签的方法的任何想法,其他使用体面的浏览器?
答案 0 :(得分:1)
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);
}
});