2012-06-05 15 views
12

Javascript kodunda, tarayıcımın sayfamdaki bir bağlantıyı takip etmesini programlı olarak yapmak istiyorum. Basit durum:Javascript/jQuery: program aracılığıyla bir bağlantı izleyin

<a id="foo" href="mailto:[email protected]">something</a> 

function goToBar() { 
    $('#foo').trigger('follow'); 
} 

Bu aslında çalışmıyor olarak varsayımsal olduğunu. Ve hayır, click'u tetiklemiyor.

Ben window.location ve window.open farkındayım ama bunlar benim için önemli bazı açılardan aşağıdaki bağlantıdan yerli farklılık gösterir: a) <base /> elementin varlığı ve b) mailto URL'lerin durumunda yer. Özellikle ikincisi önemlidir. Firefox'ta en azından window.location.href = "mailto:[email protected]" numaralı telefonun aranması, pencerenin unload işleyicilerinin tetiklenmesine neden olurken, mailto bağlantısını tıkladığımda, söyleyebildiğim kadarıyla değil.

Tarayıcının varsayılan bağlantılarını, Javascript kodundan tetiklemenin bir yolunu arıyorum.

Böyle bir mekanizma var mı? Araç setine özgü cevaplar da hoş karşılanır (özellikle Gecko için).

+0

neden mailto sayfanızda bir target = "_ blank" özniteliği kullanmıyorsunuz: link? –

+0

Yapabiliyorum ama boş bir pencere açıyor, oysa benim posta istemcim açılmıyor ama tarayıcım olduğu gibi duruyor, istediğim şey bu. – Dan

+0

jsFiddle örnekleriniz Firefox Aurora 14.0a2 (2012-06-04) ile benim için çalışır. –

cevap

17

Bildiğim kadarıyla, window.location tarayıcının varsayılan bağlantı tıklayarak tetikler aradığınız tam olarak ne yapar bildiği gibi davranışı. Bazı tarayıcılar, herhangi bir olay tetiklenmeden veya gerçek href değiştirilmeden önce protokolü fark ederler.

  • Krom: yangınları düğmesi ve bağlantı ile onbeforeunload
  • Yalnızca Firefox düğmesi
  • Safari için onbeforeunload basar: Aşağıdaki sonuçları elde aşağıda belirtilen keman demo çalışılıyor

    window.location = "mailto:[email protected]"; 
    

    asla yangınlar onbeforeunload

  • Opera: Safari ile aynı

unload olayının tetiklenmesini önlemenin iyi bir yolu, beforeunload numaralı telefona yanlış olarak dönmektir.

+0

Hayır, tam olarak aynı değil. Bkz http://jsfiddle.net/eyS6x/2/. "Beni tıkla", "beforeunload" işleyicisini çağırır, bağlantının kendisi yoktur. – Dan

+0

Yeterince adil, bunu şimdi birden çok tarayıcıda test ettim ve davranış oldukça farklı görünüyor. Cevabımı bunu yansıtacak şekilde güncelleyeceğim. –

+0

Eh, burada bir şey olabilir. Gerçek kodumda _only_ 'beforeunload' ve sahip olduğum 'boşaltma' değil. Bunu OP'mde karıştırdım. Bir mailto olup olmadığını algılayabileceğim bir _inside_ 'beforeunload' işleyicisinin bir yolu var mı? – Dan

3

YÖNTEM 1 tıklama yöntemi

HTMLElement ler bir yöntemini click()https://developer.mozilla.org/en/DOM/element.click

function goToBar() { 
    document.getElementById('foo').click(); 
} 

Yöntem 2 Ateşleme sentetik olaylar

Ben saluce onun cevabını silinmiş neden merak var. Bu çözüm geçmişte kullandığım (tıklama sadece bir IE olduğunda). Yani, bir sentetik tarayıcı olayı tetikleniyor (jQuery'nin click() gibi sahte bir değil). ... bana bu fikri kullanarak bir çözüm sonrası Let

DEMO: http://jsfiddle.net/eyS6x/3/

/** 
* Fire an event handler to the specified node. Event handlers can detect that the event was fired programatically 
* by testing for a 'synthetic=true' property on the event object 
* @param {HTMLNode} node The node to fire the event handler on. 
* @param {String} eventName The name of the event without the "on" (e.g., "focus") 
*/ 
function fireEvent(node, eventName) { 
    // Make sure we use the ownerDocument from the provided node to avoid cross-window problems 
    var doc; 
    if (node.ownerDocument) { 
    doc = node.ownerDocument; 
    } else if (node.nodeType == 9 /** DOCUMENT_NODE */){ 
    // the node may be the document itself 
    doc = node; 
    } else { 
    throw new Error("Invalid node passed to fireEvent: " + +node.tagName + "#" + node.id); 
    } 

    if (node.fireEvent) { 
    // IE-style 
    var event = doc.createEventObject(); 
    event.synthetic = true; // allow detection of synthetic events 
    node.fireEvent("on" + eventName, event); 
    } else if (node.dispatchEvent) { 
    // Gecko-style approach is much more difficult. 
    var eventClass = ""; 

    // Different events have different event classes. 
    // If this switch statement can't map an eventName to an eventClass, 
    // the event firing is going to fail. 
    switch (eventName) { 
     case "click": 
     case "mousedown": 
     case "mouseup": 
     eventClass = "MouseEvents"; 
     break; 

     case "focus": 
     case "change": 
     case "blur": 
     case "select": 
     eventClass = "HTMLEvents"; 
     break; 

     default: 
     throw "JSUtil.fireEvent: Couldn't find an event class for event '" + eventName + "'."; 
     break; 
    } 
    var event = doc.createEvent(eventClass); 
    var bubbles = eventName == "change" ? false : true; 
    event.initEvent(eventName, bubbles, true); // All events created as bubbling and cancelable. 

    event.synthetic = true; // allow detection of synthetic events 
    node.dispatchEvent(event); 
    } 
}; 

document.getElementById('button').onclick = function() { 
    fireEvent(document.getElementById('link'), 'click'); 
} 
+0

Hm .... Bunu denediğimi düşündüm ve işe yaramadı. Tekrar denememe izin ver. – Dan

+0

Gerçekten de değil. Http://jsfiddle.net/eyS6x/1/ adresini deneyin ve "Tıkla" yı tıklayın. Bu MacOS için Firefox 5.0'da. – Dan

+1

Windows'ta Chrome (19.0.1084.52 m), Firefox (10.0.3) ve IE (8.0.7600) üzerinde çalışır. Bir Mac problemi olabilir. –

İlgili konular