在某些浏览器中,"return false"在使用JavaScript动态添加到DOM时会被忽略

Ale*_*exV 5 html javascript dom google-maps dhtml

我动态地向DOM添加<a>(链接)标记:

var link = document.createElement('a');
link.href = 'http://www.google.com/';
link.onclick = function () { window.open(this.href); return false; };
link.appendChild(document.createTextNode('Google'));
//someDomNode.appendChild(link);
Run Code Online (Sandbox Code Playgroud)

我希望链接在新窗口中打开(我知道它很糟糕,但它是必需的).我也尝试使用"target"属性,但我也有这个解决方案的错误行为.

我的代码在IE和Firefox中运行良好,但返回false在Safari,Chrome和Opera中不起作用.通过不工作我的意思是在打开新窗口后遵循链接.

我想我可能是因为Google Maps V3环境......

编辑:要查看实际页面上的行为:

  1. 转到http://tinyurl.com/29q6nw6
  2. 点击地图上的任何标记,将显示一个气球.
  3. 单击气球中的标题,该链接应在新窗口中打开(在IE和FF中工作,但在Safari,Chrome和Opera中不能.

欢迎任何帮助!

Edit2:问题出在函数"MakeInfoWindowContent"中,它位于"gmaps3.js"中.我不使用DOM来创建元素(我使用字符串),因为必须将此HTML字符串传递给Google Maps(对于信息窗口 - 气球).实际上,在两个不同的地方创建了相同的链接.左边的一个,用DOM功能创建(如本问题所示),适用于所有浏览器,气球中有一个用HTML字符串创建,这个在Safari,Chrome和Opera中效果不佳(链接是在新窗口打开之后,即使返回false也是如此).

编辑3:仍然不知道为什么会发生这种情况......如果有人有想法,请告诉我!

nik*_*org 3

阻止事件的默认操作可能有效吗?不确定 gmaps 是否以其他方式处理其信息窗口中的链接,如果没有,它应该可以工作。

更新:第一个示例不起作用。使用“内联”onclick 分配事件时,事件未传递。这个经过测试并发现可以工作。

function bindEvent(target, event, handler) {
    if (typeof target.addEventListener != 'undefined') {      
        target.addEventListener(event, handler, false);
    } else if (typeof target.attachEvent != 'undefined') {
        target.attachEvent('on' + event, handler); 
    } 
}

var link = document.createElement('a');
link.href = 'http://www.google.com/';
link.appendChild(document.createTextNode('Google'));

bindEvent(link, 'click', function (e) { 
    if (typeof e.preventDefault != 'undefined') {
        // Common/W3C events
        e.preventDefault();
    } 

    // (Old) IE specific events
    e.returnValue = false; 

    var target = e.target || e.srcElement;
    window.open(target.href); 

    return false; 
});

document.getElementsByTagName('body')[0].appendChild(link);
Run Code Online (Sandbox Code Playgroud)