Javascript 原型事件。IE的停止播放>;=8.
我了解处理事件的正确方法。IE的停止播放是Javascript 原型事件。IE的停止播放>;=8.,javascript,Javascript,我了解处理事件的正确方法。IE的停止播放是 if(event.stopPropagation) { event.stopPropagation(); } else { event.returnValue = false; } 但是,是否有可能对事件进行原型化,这样我就不必每次使用stopPropagation时都进行检查 这个问题似乎很有帮助:但是我不太理解被接受的答案,也不太理解它是如何成为一个基本上可以设置和遗忘的原型。可能是这样的: Event = Event || wi
if(event.stopPropagation) {
event.stopPropagation();
} else {
event.returnValue = false;
}
但是,是否有可能对事件进行原型化,这样我就不必每次使用stopPropagation时都进行检查
这个问题似乎很有帮助:但是我不太理解被接受的答案,也不太理解它是如何成为一个基本上可以设置和遗忘的原型。可能是这样的:
Event = Event || window.Event;
Event.prototype.stopPropagation = Event.prototype.stopPropagation || function() {
this.cancelBubble = true;
}
returnValue=false
与默认值类似:
Event.prototype.preventDefault = Event.prototype.preventDefault || function () {
this.returnValue = false;
}
如果您正在用普通javascript进行自己的事件处理,那么您可能已经有了一个用于设置事件处理程序的跨浏览器例程。您可以将抽象放在该函数中。下面是我使用的一个模拟jQuery功能的函数(如果事件处理程序返回
false
,那么stopPropagation()
和preventDefault()
都会被触发。显然,您可以根据需要对其进行修改:
// refined add event cross browser
function addEvent(elem, event, fn) {
// allow the passing of an element id string instead of the DOM elem
if (typeof elem === "string") {
elem = document.getElementById(elem);
}
function listenHandler(e) {
var ret = fn.apply(this, arguments);
if (ret === false) {
e.stopPropagation();
e.preventDefault();
}
return(ret);
}
function attachHandler() {
// normalize the target of the event
window.event.target = window.event.srcElement;
// make sure the event is passed to the fn also so that works the same too
// set the this pointer same as addEventListener when fn is called
var ret = fn.call(elem, window.event);
// support an optional return false to be cancel propagation and prevent default handling
// like jQuery does
if (ret === false) {
window.event.returnValue = false;
window.event.cancelBubble = true;
}
return(ret);
}
if (elem.addEventListener) {
elem.addEventListener(event, listenHandler, false);
} else {
elem.attachEvent("on" + event, attachHandler);
}
}
或者,您可以创建如下实用程序函数:
function stopPropagation(e) {
if(e.stopPropagation) {
e.stopPropagation();
} else {
e.returnValue = false;
}
}
只需调用该函数,而不是对每个函数中的事件进行操作。我们可以单独使用它:
event.cancelBubble=true
测试在所有浏览器中都能工作。在另一个问题中,我发布了一个海报链接,其中提到了此方法,但接受了不同的答案。他提到它不能通过JSFIDLE工作。这就是为什么我关心此方法…我很清楚…当使用fn.call时,实际上不是启动传递到事件handl中的函数吗呃?我不知道它是如何或为什么返回false的?如果事件处理程序没有使用event.stopPropagation怎么办?还有一件事。我从未见过return使用括号。出于好奇,这与return ret有什么不同?@ryandlf-yes fn.call正在调用自定义事件处理程序函数(与
addEvent()
一起传入的,用于安装事件处理程序。如果要stopPropagation())
特定事件,则在事件处理程序函数中返回false
。如果不返回,则不返回。由事件处理程序函数决定是否停止传播。这是jQuery使用的模型。@ryandlf返回false
与返回(false)没有区别
。在多行语句的情况下,需要使用参数来确保JS解释器正确执行。通常情况下,return
语句不需要使用参数。因此,对于我已经编写的每个事件处理程序,我必须返回并删除e.stopPropagation()而是使用return false,它将同时调用stopProp和preventDefault?换句话说,有必要在事件处理程序函数中显式地不调用这些函数,否则它将在跨浏览器时失败?