Chrome, Javascript, window.open yeni sekmede


110

Chrome'da bu, yeni bir sekmede açılır:

<button onclick="window.open('newpage.html', '_blank')" />

bu yeni bir pencerede açılır (ancak bunun yeni bir sekmede de açılmasını istiyorum:

<script language="javascript">
  window.open('newpage.html', '_blank');
</script>

Bu uygulanabilir mi?


2
Neyi onayladığınızdan emin misiniz? Her iki parça da aynı sonuca sahip.
Denys Séguret

1
Bir pencerenin bir sekmede mi yoksa yeni bir pencerede mi açılacağı yerel tarayıcıya ve kullanıcının tarayıcısını nasıl yapılandıracağına bağlıdır - bu, javascript'te belirtebileceğiniz bir şey değildir.
jfriend00

Yanıtlar:


150

Bunu doğrudan kontrol edemezsiniz çünkü bu, Internet Explorer kullanıcıları tarafından kontrol edilen bir seçenektir.

Window.open'ı kullanarak sayfaları farklı bir pencere adıyla açmak, pop-up gibi yeni bir tarayıcı penceresinde, VEYA kullanıcı tarayıcıyı bu şekilde yapılandırdıysa yeni bir sekmede açılır.

DÜZENLE:

Daha ayrıntılı bir açıklama:

1. Modern tarayıcılarda, window.open bir açılır pencere yerine yeni bir sekmede açılacaktır.

2. 3. parametrede seçenekleri belirterek bir tarayıcıyı yeni bir pencere ('açılır') kullanmaya zorlayabilirsiniz.

3. window.open çağrısı kullanıcı tarafından başlatılan bir olayın parçası değilse, yeni bir pencerede açılır.

4. Bir "kullanıcı tarafından başlatılan olay" aynı işlev çağrısına sahip değildir - ancak bir kullanıcı tıklamasıyla başlatılan işlevden kaynaklanmalıdır

5. Kullanıcı tarafından başlatılan bir olay, bir işlev çağrısını delege eder veya ertelerse (tıklama olayına bağlı olmayan bir olay dinleyicide veya temsilcide veya örneğin setTimeout kullanarak), "kullanıcı tarafından başlatılan" durumunu kaybeder

6. Bazı açılır pencere engelleyicileri, pencerelerin kullanıcı tarafından başlatılan olaylardan açılmasına izin verir, ancak aksi halde açılanlara izin vermez.

7. Herhangi bir açılır pencere engellenirse, normalde bir engelleyici tarafından izin verilenler (kullanıcı tarafından başlatılan olaylar aracılığıyla) bazen engellenir. Bazı örnekler…

Bir pencereyi yeni bir sekme yerine yeni bir tarayıcı örneğinde açmaya zorlamak:

window.open('page.php', '', 'width=1000');

Aşağıdakiler, başka bir işlevi çağırsa bile, kullanıcı tarafından başlatılan bir olay olarak nitelendirilir:

function o(){
  window.open('page.php');
}
$('button').addEvent('click', o);

SetTimeout onu ertelediği için aşağıdakiler kullanıcı tarafından başlatılan bir olay olarak nitelendirilmez:

function g(){
  setTimeout(o, 1);
}
function o(){
  window.open('page.php');
}
$('button').addEvent('click', g);

2
Bunu sadece Chrome ve FF'de test ederek eklemek istiyorum, "kullanıcı tarafından başlatılan olay" olarak tanımladığınız şeyde window.open kullanmanın tarayıcının varsayılan eylemini koruduğunu öğrendim. Bununla demek istediğim, eğer Chrome'da shift'i basılı tutarsanız ve yeni bir tarayıcı penceresini tıklarsanız, ctrl tuşunu basılı tutarsanız (veya farenin orta düğmesine basarsanız) arka planda yeni bir sekme açılacaktır. Bu çok güzel, her yere bağlantı etiketi yerleştirmenize gerek kalmadan bazı şeyler yapabilirsiniz.
Hoffmann

3
"Window.open çağrısı kullanıcı tarafından başlatılan bir olayın parçası değilse, yeni bir pencerede açılır." Hayır, neredeyse kesinlikle hiç açılmayacak.
TJ Crowder

3
29.09.2014 itibarıyla, en son Firefox ESR ve IE 11, js çağrıları pencere adı olarak _blank kullandığında _blank veya window.open bağlantılarını yeni bir pencerede açıyor. Mevcut Chrome o kadar basit değil. Yukarı, sol, genişlik, yükseklik, araç çubuğu, konum, dizinler, durum, menü çubuğu, kaydırma çubukları ve yeniden boyutlandırılabilir olan yeni bir pencere açmayı ve sırayla bunların her birini atlamayı test ettim. Chrome, durum, menü çubuğu veya kaydırma çubuklarının atlandığı durumlar dışında hepsini yeni bir sekmede açtı. Bu çok keyfi görünüyor, inanması zor, ama deneysel olarak olan buydu. Örnek burada: jsbin.com/mobiyeqojaha/1
enigment

34

Kullanıcı beğenirse, bazen bir sekme kullanımını zorlamak yararlı olabilir. Prakash'ın yukarıda belirttiği gibi, bu bazen kullanıcı tarafından başlatılmayan bir olayın kullanılmasıyla belirlenir, ancak bunun etrafında yollar vardır.

Örneğin:

$("#theButton").button().click( function(event) {
   $.post( url, data )
   .always( function( response ) {
      window.open( newurl + response, '_blank' );
   } );
} );

"her zaman" işlevi kullanıcı tarafından başlatılmış sayılmadığından, "her zaman" yeni bir tarayıcı penceresinde "newurl" yi her zaman açacaktır. Ancak, bunu yaparsak:

$("#theButton").button().click( function(event) {
   var newtab = window.open( '', '_blank' );
   $.post( url, data )
   .always( function( response ) {
      newtab.location = newurl + response;
   } );
} );

IS kullanıcı tarafından başlatılan düğme tıklamasındaki kullanıcı tercihine göre belirlendiği gibi yeni tarayıcı penceresini açar veya yeni sekmeyi oluştururuz. Ardından AJAX gönderisinden döndükten sonra konumu istenen URL'ye ayarladık. Voila, eğer kullanıcı beğenirse bir sekme kullanımını zorlarız.


Window.open'da chrome'da ayarlanmış bir kırılma noktanız varsa tarayıcının yeni bir pencere açtığını fark ettim. Kodun kırılmamasına izin verilmesi, bunun yerine yeni bir sekmenin açılmasına neden olur.
skinnybrit51

Window.open'ınız açılmadığı ve işlevin sonucu 5/6/7 saniye kadar süren bir şey olmadığı sürece, bu bir tamamdır. İşlevin, 10 saniye süren bir PDF oluşturan bir sunucuya veri gönderip göndermediğini düşünün. Pencere boş bir sekmeye açılır ve kullanıcı sihirli bir şekilde doldurulana kadar boş sekmeye 10 saniye boyunca bakar. Yine de iOS'ta tek çözümle ilgili.
Kevin Brown


11

Şu anda (Chrome 39) Bu kodu yeni bir sekme açmak için kullanıyorum:

window.open('http://www.stackoverflow.com', '_blank', 'toolbar=yes, location=yes, status=yes, menubar=yes, scrollbars=yes');

Elbette bu, Chrome'un gelecekteki sürümlerinde değişebilir.

Kullanıcılarınızın kullandığı tarayıcıyı kontrol edemiyorsanız, bunu kullanmak kötü bir fikirdir. Gelecek sürümlerde veya farklı ayarlarla çalışmayabilir.


Jfriend00'ün yorumuna göre, kullanıcının tarayıcıyı yapılandırma şekli kodun değil, yeni pencerelerin nasıl açılacağını belirler.
Lee Taylor

Çevrenizi kontrol edemiyorsanız böyle bir çözüme güvenmenin kötü bir fikir olduğu konusunda size katılıyorum. Ancak bunun mümkün olduğu bazı durumlar vardır (örneğin, bunu kendi taşınabilir Chrome'uyla birlikte gelen bir uygulamada kullanıyorum). Bunu açıklığa kavuşturmak için yanıtlayıcımı düzenledim.
Nico Wiedemann

2
Merak edenler için, bu kod parçacığını çalıştırmak şu hata nedeniyle işe yaramıyor:VM646 js:12 Blocked opening 'http://www.stackoverflow.com/' in a new window because the request was made in a sandboxed frame whose 'allow-popups' permission is not set.
Benjamin Crouzier

6

Bu, bağlantıyı Chrome ve Firefox'ta yeni bir sekmede ve muhtemelen test etmediğim daha fazla tarayıcıda açacaktır:

var popup  = $window.open("about:blank", "_blank"); // the about:blank is to please Chrome, and _blank to please Firefox
popup.location = 'newpage.html';

Temel olarak yeni bir boş sekme açar ve ardından bu boş sekmenin konumunu ayarlar. Tarayıcı sekmesi / penceresi davranışı gerçekten Tarayıcının ve Kullanıcının etki alanı, sorumluluğu ve seçimidir çünkü bunun bir tür hack olduğuna dikkat edin.

İkinci satır bir geri aramada çağrılabilir (örneğin, bir AJAX isteği yaptıktan sonra), ancak bu durumda tarayıcı bunu kullanıcı tarafından başlatılan bir tıklama olayı olarak tanımaz ve açılır pencereyi engelleyebilir.


1
$windowsadece AngularJS'nin kullanım şeklidir window. Bunun windowyerine kullanabilirsiniz . Daha fazla bilgi: docs.angularjs.org/api/ng/service/$window
Magne

3

Mini çözümü temizle $('<form action="http://samedomainurl.com/" target="_blank"></form>').submit()


0

Yeni sekmede açmak için bu kodu kullanabilirsiniz ..

function openWindow( url )
{
  window.open(url, '_blank');
  window.focus();
}

Stackoverflow'dan aldım ..


1
Bu işe yarar, ancak yalnızca bir kullanıcı tıklama işleyicisindeyseniz. Aksi takdirde, yeni bir pencere açar (ancak Firefox en azından kullanıcı izin verene kadar sizi engeller).
djsmith

@djsmith, bunu kullanıyorum .. ve yalnızca IE7'de sorunla karşılaşıyorum. Başka bir çözümünüz varsa lütfen önerin .. Teşekkür ederiz ..
Dilip Rajkumar

-2

Kullandığım en iyi yol:

1- html'nize bağlantı ekleyin:

<a id="linkDynamic" target="_blank" href="#"></a>

2- JS işlevi ekleyin:

function OpenNewTab(href)
{
    document.getElementById('linkDynamic').href = href;
    document.getElementById('linkDynamic').click();
}

3- OpenNewTab işlevini istediğiniz bağlantıyla çağırmanız yeterli

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.