2008-09-11 14 views
18

परिदृश्य एक पॉपअप विंडो खोलने के लिए कैसे मिलता है:मैं जावास्क्रिप्ट वर्तमान मॉनीटर पर

  1. उपयोगकर्ता दो पर नज़र रखता है है।
  2. उनके ब्राउज़र माध्यमिक मॉनिटर पर खुला है।
  3. वे ब्राउज़र जो window.open() किसी शीर्ष और बाएं खिड़की ऑफसेट के साथ कॉल में एक लिंक पर क्लिक करें।
  4. पॉपअप विंडो हमेशा अपने प्राथमिक मॉनीटर पर खुलता है।

क्या जावास्क्रिप्ट में पॉपअप विंडो को प्रारंभिक ब्राउज़र विंडो (सलामी बल्लेबाज) के समान मॉनीटर पर खोलने के लिए जावास्क्रिप्ट में कोई तरीका है?

+0

नहीं एक मेरे लिए इन 'समाधान' काम का एक एक। क्या आपको कोई रास्ता मिला। – oma

+0

@oma मैंने एक समाधान प्रदान किया है जो मेरे लिए काम करता है, इस पोस्ट में उत्तर दिया गया है: http://stackoverflow.com/questions/6911138/position-javascript-window-open-centered-on-secondary-screen/14269826# 1426 9 826 –

+0

आपको इसे इसके बजाय यहां पोस्ट करना चाहिए था। दूसरा एक डुप्लिक है और इस धागे में अधिक प्रासंगिक संदर्भ है। – oma

उत्तर

-2

जब तक आप x और y स्थिति यह है कि विशेष रूप से मॉनीटर पर गिर जाता है पता है के रूप में आप कर सकते हैं:

var x = 0; 
var y = 0; 
var myWin = window.open(''+self.location,'mywin','left='+x+',top='+y+',width=500,height=500,toolbar=1,resizable=0'); 
+0

पर ले जाने दें ओपी को एक्स और वाई स्थिति को कैसे पता होना चाहिए? आप यह नहीं मान सकते कि हमेशा दो मॉनीटर होंगे, या उनका संकल्प ... इससे मदद नहीं मिलती है। –

21

आप पर नजर रखने निर्दिष्ट नहीं कर सकते, लेकिन आप के रूप में पॉप अप विंडो की स्थिति निर्दिष्ट कर सकते हैं जहां क्लिक ने खिड़की को पॉपअप के कारण बनाया था।

उपयोग getMouseXY() फ़ंक्शन मानों विधि window.open() करने के लिए छोड़ दिया और शीर्ष args के रूप में पारित करने के लिए मिलता है। (बाएं और शीर्ष तर्क केवल V3 और ऊपर ब्राउज़र के साथ काम करते हैं)।

window.open डॉक्स: http://www.javascripter.net/faq/openinga.htm

function getMouseXY(e) { 
    if (event.clientX) { // Grab the x-y pos.s if browser is IE. 
     CurrentLeft = event.clientX + document.body.scrollLeft; 
     CurrentTop = event.clientY + document.body.scrollTop; 
    } 
    else { // Grab the x-y pos.s if browser isn't IE. 
     CurrentLeft = e.pageX; 
     CurrentTop = e.pageY; 
    } 
    if (CurrentLeft < 0) { CurrentLeft = 0; }; 
    if (CurrentTop < 0) { CurrentTop = 0; }; 

    return true; 
} 
0

हैं आप प्रत्येक मॉनिटर के संकल्प जानते हैं, तो आप इस का अनुमान कर सकते हैं। सार्वजनिक वेबसाइट के लिए एक बुरा विचार है, लेकिन यदि आप जानते हैं (कुछ अजीब कारणों से) यह उपयोगी हो सकता है कि यह परिदृश्य हमेशा लागू होगा।

माउस के लिए संबंधित स्थिति (ऊपर बताई गई अनुसार) या मूल ब्राउज़र विंडो में भी उपयोगी हो सकता है, हालांकि आपको लगता है कि उपयोगकर्ता ब्राउज़र को अधिकतम (जो आवश्यक नहीं है) का उपयोग करता है।

18

यहाँ कुछ मैं बेशर्म फेसबुक OAuth एपीआई से इंजीनियर रिवर्स है। फ़ायरफ़ॉक्स/क्रोम में प्राथमिक और माध्यमिक मॉनीटर पर परीक्षण किया गया।

function popup_params(width, height) { 
    var a = typeof window.screenX != 'undefined' ? window.screenX : window.screenLeft; 
    var i = typeof window.screenY != 'undefined' ? window.screenY : window.screenTop; 
    var g = typeof window.outerWidth!='undefined' ? window.outerWidth : document.documentElement.clientWidth; 
    var f = typeof window.outerHeight != 'undefined' ? window.outerHeight: (document.documentElement.clientHeight - 22); 
    var h = (a < 0) ? window.screen.width + a : a; 
    var left = parseInt(h + ((g - width)/2), 10); 
    var top = parseInt(i + ((f-height)/2.5), 10); 
    return 'width=' + width + ',height=' + height + ',left=' + left + ',top=' + top + ',scrollbars=1'; 
} 

window.open(url, "window name", "location=1,toolbar=0," + popup_params(modal_width, modal_height)); 
+0

इस लाइन का क्या मतलब है? '' 'var h = (a <0)? खिड़की का पर्दा।चौड़ाई + ए: ए; '' 'यह उस लाइन के साथ स्क्रीन के लिए सही ढंग से स्क्रीन की स्थिति नहीं दे रहा था। – plainjimbo

+0

ओएस एक्स पर यह फ़ायरफ़ॉक्स में सभी मॉनिटर व्यवस्था के लिए काम करता है। क्रोम में ओवर-अंडर मॉनीटर व्यवस्था के लिए काम नहीं करता है (क्षैतिज रूप से सही स्थिति में होगा लेकिन मुख्य मॉनीटर से लंबवत नहीं होगा)। सफारी में साइड-बाय-साइड व्यवस्था के लिए काम नहीं करता है (सही ढंग से लंबवत स्थिति में होगा लेकिन मुख्य मॉनीटर से क्षैतिज रूप से आगे नहीं बढ़ेगा)। क्रोम और सफारी के लिए मुझे नहीं लगता कि ऐसा करने के लिए और कुछ और है, ब्रोसर सीमाएं/बग्स प्रतीत होता है। – plainjimbo

+0

फेसबुक साझा करने की कोशिश करते समय यह मेरे लिए पूरी तरह से काम करता है शेयर संवाद (मैं शर्त लगाता हूं कि इस प्रश्न को देखकर बहुत से लोग इसे उसी कारण से कर रहे हैं)। –

6
// Pops a window relative to the current window position 
function popup(url, winName, xOffset, yOffset) { 
    var x = (window.screenX || window.screenLeft || 0) + (xOffset || 0); 
    var y = (window.screenY || window.screenTop || 0) + (yOffset || 0); 
    return window.open(url, winName, 'top=' +y+ ',left=' +x)) 
} 

तो वह ऐसा कॉल करें और यह वर्तमान विंडो

popup('http://www.google.com', 'my-win'); 

के शीर्ष पर खोलने या कर देगा यह थोड़ा ऑफसेट

popup('http://www.google.com', 'my-win', 30, 30); 

मुद्दा यह है कि खिड़की है। स्क्रीनएक्स/स्क्रीन लेफ्ट आपको मॉनिटर न केवल पूरे डेस्कटॉप के संबंध में स्थिति देता है।

window.screen.left आदर्श उम्मीदवार आप जानकारी की आवश्यकता देने के लिए किया जाएगा। समस्या यह है कि जब पेज लोड होता है तो यह सेट होता है और उपयोगकर्ता विंडो को अन्य मॉनीटर पर ले जा सकता है।

और अधिक शोध

इस समस्या का एक अंतिम समाधान (सिर्फ वर्तमान विंडो की स्थिति से offsetting परे) स्क्रीन उस खिड़की में है। चूंकि स्क्रीन वस्तु के रूप में अपडेट नहीं करता के आयामों को जानने की आवश्यकता है उपयोगकर्ता चारों ओर एक खिड़की चलाता है, हमें वर्तमान स्क्रीन रिज़ॉल्यूशन का पता लगाने का अपना तरीका तैयार करने की आवश्यकता है।

function openAtTopLeftOfSameMonitor(url, winName) { 
    getScreenProps(function(scr){ 
    window.open(url, winName, 'top=0,left=' + scr.left); 
    }) 
} 
+0

एफएफ में काम करता है। ऐसा लगता है जैसे क्रोम बाएं और शीर्ष पैरामीटर के बारे में ज्यादा परवाह नहीं करता है। – oma

0

मैं में भाग: यहाँ है कि मैं क्या

/** 
* Finds the screen element for the monitor that the browser window is currently in. 
* This is required because window.screen is the screen that the page was originally 
* loaded in. This method works even after the window has been moved across monitors. 
* 
* @param {function} cb The function that will be called (asynchronously) once the screen 
* object has been discovered. It will be passed a single argument, the screen object. 
*/ 
function getScreenProps (cb) { 
    if (!window.frames.testiframe) { 
     var iframeEl = document.createElement('iframe'); 
     iframeEl.name = 'testiframe'; 
     iframeEl.src = "about:blank"; 
     iframeEl.id = 'iframe-test' 
     document.body.appendChild(iframeEl); 
    } 

    // Callback when the iframe finishes reloading, it will have the 
    // correct screen object 
    document.getElementById('iframe-test').onload = function() { 
     cb(window.frames.testiframe.screen); 
     delete document.getElementById('iframe-test').onload; 
    }; 
    // reload the iframe so that the screen object is reloaded 
    window.frames.testiframe.location.reload(); 
}; 

के साथ आया था तो अगर आप हमेशा जो कुछ भी नजर रखने के विंडो में है सबसे ऊपर बाईं ओर विंडो खोलने के लिए करना चाहता था, तो आप निम्न का उपयोग कर सकते है इस मुद्दे को हाल ही में और आखिरकार स्क्रीन पर पॉप अप विंडो को स्थानांतरित करने का एक तरीका मिला जिस पर यह ट्रिगर हुआ है। मेरी GitHub पेज यहाँ पर मेरे समाधान पर एक नज़र डालें: https://github.com/svignara/windowPopUp

चाल window.screen वस्तु है, जो रिटर्न availWidth, availHeight, availLeft और availTop मानों का उपयोग में है (और साथ width और height के रूप में)। ऑब्जेक्ट में चर के पूर्ण सूची और इन चरों का प्रतिनिधित्व करने के लिए https://developer.mozilla.org/en-US/docs/DOM/window.screen देखें।

अनिवार्य रूप से, मेरे समाधान को पॉपअप के लिए ट्रिगर पर क्लिक होने पर window.screen के मान मिलते हैं। इस तरह से मैं निश्चित रूप से जानता हूं कि किस मॉनीटर स्क्रीन से इसे क्लिक किया जा रहा है। availLeft मूल्य बाकी का ख्याल रखता है। ऐसे करें:

मूल रूप से करता है, तो बाएं (availLeft) से पहले उपलब्ध पिक्सेल नकारात्मक है, कि हमें बता रहा है "मुख्य" पर नजर रखने के बाईं ओर एक मॉनिटर नहीं है। इसी तरह, अगर बाएं से पहले उपलब्ध पिक्सेल 0 से अधिक है, इसका मतलब है 2 चीजों में से एक:

  1. मॉनिटर "मुख्य" पर नजर रखने के अधिकार के लिए है, या
  2. कुछ "जंक" नहीं है स्क्रीन के बाईं ओर पर (संभवतः आवेदन गोदी या विंडोज़ प्रारंभ मेनू) या तो मामले में आप चाहते अपने पॉपअप बाएँ से उपलब्ध पिक्सेल के बाद से शुरू करने के लिए की भरपाई में

offsetLeft = availableLeft + ((availableWidth - modalWidth)/2) 
1

ओपन वर्तमान मॉनीटर पर खिड़की केंद्रित, क्रोम के साथ भी काम कर रहे:

function popupOnCurrentScreenCenter(url, title, w, h) { 
    var dualScreenLeft = typeof window.screenLeft !== "undefined" ? window.screenLeft : screen.left; 
    var dualScreenTop = typeof window.screenTop !== "undefined" ? window.screenTop : screen.top; 

    var width = window.innerWidth ? window.innerWidth : 
     document.documentElement.clientWidth ? document.documentElement.clientWidth : screen.width; 
    var height = window.innerHeight ? window.innerHeight : 
     document.documentElement.clientHeight ? document.documentElement.clientHeight : screen.height; 

    var left = ((width/2) - (w/2)) + dualScreenLeft; 
    var top = ((height/2) - (h/2)) + dualScreenTop; 
    var newWindow = 
     window.open(url, title, 'scrollbars=yes, width=' + w + ', height=' + h + ', top=' + top + ', left=' + left); 

    // Puts focus on the newWindow 
    if (window.focus) { 
     newWindow.focus(); 
    } 
} 
संबंधित मुद्दे