উইন্ডো.ওপেনে বাইপাস পপআপ ব্লকার যখন জিকুয়েরি ইভেন্ট.প্রিভেন্টডেফল্ট () সেট করা থাকে তখন


99

হাইপারলিংকের ক্লিক ইভেন্টে আমি শর্তসাপেক্ষে একটি জিকুয়ারি ডায়ালগটি দেখাতে চাই।

আমার কন্ডিশন 1 এর মতো একটি জিকুয়েরি ডায়লগ খুলুন এবং শর্ত 1 সন্তুষ্ট না হলে, যার ক্লিক ইভেন্টটি প্রশ্নযুক্ত তার 'href' ট্যাগ দ্বারা উল্লিখিত পৃষ্ঠাটিতে নেভিগেট করুন।

আমি লিঙ্কের ক্লিক ইভেন্টে একটি ফাংশন কল করতে সক্ষম। এই ফাংশনটি এখন অন্য ইউআরএল (যা আমার স্প্রিং কন্ট্রোলারকে কার্যকর করে এবং প্রতিক্রিয়া দেখায়) চালিয়ে কথিত শর্তটি পরীক্ষা করে।

সবগুলি কেবল উইন্ডো.পেন দিয়ে নিখুঁতভাবে কাজ করে পপআপ ব্লকার দ্বারা অবরুদ্ধ।

$('a[href*=/viewpage?number]').live('click', function(e) {
    e.preventDefault();
    redirectionURL = this.href;
    pageId= getUrlVars(redirectionURL)["number"];
    $.getJSON("redirect/" + pageId, {}, function(status) {
        if (status == null) {
            alert("Error in verifying the status.");
        } else if(!status) {
            $("#agreement").dialog("open");
        } else {
            window.open(redirectionURL);
        }
    });
});

যদি আমি e.preventDefault();কোড থেকে সরিয়ে ফেলি তবে পপউপ ব্লকার পৃষ্ঠাটি ব্লক করে না, তবে শর্ত 1 এর জন্য এটি ডায়ালগটি খোলে পাশাপাশি 'href' পৃষ্ঠাটি খুলবে।

আমি যদি একটি সমাধান করি তবে এটি অন্যের জন্য সমস্যা তৈরি করে। আমি উভয় শর্ত একই সাথে न्याय দিতে পারছি না।

আপনি কি আমাকে এই সমস্যাটি সমাধান করতে সহায়তা করতে পারেন?

এটি সমাধান হয়ে গেলে আমার কাছে আরও একটি সমস্যা সমাধানের দরকার আছে অর্থাৎ কথোপকথনের ঠিক ইভেন্টে নেভিগেশন :)


4
.l () এর অবমানিত এবং একটি পয়েন্টার ব্যবহার না করার চেষ্টা করুন!
মাস-ডিজাইনগুলি

@ এভিলিপি: অন্যরা যেমন আপনাকে গতবার বলেছিল, কেবলমাত্র 1.7 এবং তার বেশি। একজন অনেক প্রকল্পের এখনও 1.5 অথবা 1.6 হতে হবে।
টিজে ক্রোডার

10
ডাউনভোটার: কেবলমাত্র আপনি পপআপগুলি পছন্দ করেন না, তার অর্থ এই নয় যে এই প্রশ্নটি ডাউনভোট হওয়া উচিত। কোনও প্রশ্নকে যদি "... কোনও গবেষণামূলক প্রচেষ্টা না দেখায়; যদি অস্পষ্ট হয় বা দরকারী না হয় তবে তা নিম্নোক্ত করা উচিত " । প্রশ্নটি পরিষ্কার, অলস বলে মনে হচ্ছে না এবং কারণগুলির একটি অপ্রয়োজনীয় সংমিশ্রণ থেকে উত্পন্ন।
টিজে ক্রাউডার

@ টিজে ক্রাউডার: তিনি কোন সংস্করণ ব্যবহার করছেন তা তিনি নির্দিষ্ট করেননি। সুতরাং আমার বিবেচনা করা উচিত যে তিনি সর্বশেষতম সংস্করণটি ব্যবহার করছেন। তিনি যদি অন্যরকম সংস্করণ ব্যবহার করছেন তবে আমি নিশ্চিত যে সে উল্লেখ করবে কারণ তিনি যখন লাইভকে অবহিত করা হয়েছে তা সম্পর্কে তিনি সচেতন থাকবেন এবং তিনি লাইভ () কী ব্যবহার করছেন তা ব্যাখ্যা করবে। কেউ আমাকে "শেষ" সময়টি কখনও বলেনি তাই আমি আপনাকে নিজের বিরতি দিয়ে শান্ত হওয়া উচিত I এত কঠোর হওয়ার দরকার নেই ...
মাস-ডিজাইনগুলি

সে সম্পর্কে কোনও বিজ্ঞপ্তি পাইনি। তবে এটি বিবেচনা করা কি স্বাভাবিক নয় যে কেউ যদি তাদের সংস্করণটি নির্দিষ্ট করে না বলে বিবেচনা করে যে তারা সর্বশেষ ব্যবহার করছে? আমি বোঝাতে চাইছি একটি কারণে আমাকে 1.3 ব্যবহার করতে হবে এবং আমি আরও নতুন এবং আরও উন্নত সংস্করণটি সম্পর্কে সচেতন।
মাস-ডিজাইনগুলি

উত্তর:


144

পপআপ ব্লকাররা কেবল window.openতখনই ব্যবহারকারীর ইভেন্টের প্রসেসিংয়ের সময় ব্যবহার করা হলে (ক্লিকের মতো) মঞ্জুরি দেয় । আপনার ক্ষেত্রে, আপনি window.open পরে কল করছেন , ইভেন্টের সময় নয়, কারণ $.getJSONঅ্যাসিনক্রোনাস।

আপনার দুটি বিকল্প রয়েছে:

  1. বরং আরও কিছু করুন window.open

  2. এজ্যাক্স কলটিকে সিঙ্ক্রোনাস করুন, যা ব্রাউজারের ইউআই লক করে দেওয়ার কারণে সাধারণত আপনার প্লেগের মতো এড়ানো উচিত। $.getJSONসমান:

    $.ajax({
      url: url,
      dataType: 'json',
      data: data,
      success: callback
    });
    

    ... এবং তাই $.getJSONউপরেরগুলিতে আপনার প্যারামগুলি ম্যাপ করে এবং সংযুক্ত করে আপনি নিজের কলকে সিঙ্ক্রোনাস করতে পারেন async: false:

    $.ajax({
        url:      "redirect/" + pageId,
        async:    false,
        dataType: "json",
        data:     {},
        success:  function(status) {
            if (status == null) {
                alert("Error in verifying the status.");
            } else if(!status) {
                $("#agreement").dialog("open");
            } else {
                window.open(redirectionURL);
            }
        }
    });
    

    আবার, আপনি যদি আপনার লক্ষ্য অর্জনের জন্য অন্য কোনও উপায় খুঁজে পান তবে আমি সিঙ্ক্রোনাস অজ্যাক্স কলগুলির পক্ষে নেই। আপনি যদি না পারেন তবে আপনি সেখানে যান।

    এখানে কোডের একটি উদাহরণ যা অ্যাসিক্রোনাস কলের কারণে পরীক্ষায় ব্যর্থ হয়:

    সরাসরি উদাহরণ | লাইভ সোর্স (জেএসবিনে পরিবর্তনের কারণে লাইভ লিঙ্কগুলি আর কাজ করবে না)

    jQuery(function($) {
      // This version doesn't work, because the window.open is
      // not during the event processing
      $("#theButton").click(function(e) {
        e.preventDefault();
        $.getJSON("http://jsbin.com/uriyip", function() {
          window.open("http://jsbin.com/ubiqev");
        });
      });
    });
    

    এবং এখানে সিঙ্ক্রোনাস কল ব্যবহার করে কাজ করে এমন একটি উদাহরণ রয়েছে:

    সরাসরি উদাহরণ | লাইভ সোর্স (জেএসবিনে পরিবর্তনের কারণে লাইভ লিঙ্কগুলি আর কাজ করবে না)

    jQuery(function($) {
      // This version does work, because the window.open is
      // during the event processing. But it uses a synchronous
      // ajax call, locking up the browser UI while the call is
      // in progress.
      $("#theButton").click(function(e) {
        e.preventDefault();
        $.ajax({
          url:      "http://jsbin.com/uriyip",
          async:    false,
          dataType: "json",
          success:  function() {
            window.open("http://jsbin.com/ubiqev");
          }
        });
      });
    });
    

4
অসংখ্য ধন্যবাদ. কল সিঙ্ক্রোনাস করার আপনার পরামর্শটি কবজির মতো কাজ করেছে। এটিই আমাকে সংলাপের ঠিকঠাক ইভেন্টে নেভিগেশন পরিচালনা করার সম্ভাব্য পরবর্তী সংখ্যায় সহায়তা করেছিল।
mavaze

যেহেতু টিজে ক্রাউডার দুটি প্রশ্ন খোলা রেখেছেন, [1] উইন্ডো.ওপেন] এবং [2] এর বিকল্প সন্ধান করুন। সম্প্রদায়ের সুবিধার জন্য সেগুলি সম্পর্কে এজ্যাক্স এজেক্স সিঙ্ক্রোনাস কল] পরামর্শগুলি স্বাগত। অন্যথায় আমি তার উত্তরটি এই প্রশ্নের জন্য একটি নিখুঁত সমাধান খুঁজে পেয়েছি :)
ম্যাভেজ

4
আমার জন্য, আমি ব্যবহারকারীকে ক্লিক করতে অনুরোধ করার জন্য লক্ষ্য = "_ ফাঁকা" যুক্ত একটি লিঙ্ক যুক্ত করেছি।
হিরোশি

4
@ ইভান: আপনাকে সরাসরি এক্সএইচআর ব্যবহার করতে হবে। সিঙ্ক্রোনাস অনুরোধগুলি হ্রাস করার জন্য টিকিটে একটি উদাহরণ রয়েছে ।
টিজে ক্রাউডার

4
@ মাওয়াজেজে আমি মনে করি আপনি যদি প্রথমে উইন্ডোটি খুলতে নিয়ন্ত্রণ প্রবাহ পরিবর্তন করতে পারেন তবে (সিঙ্ক), এজ্যাক্স অনুরোধটি (অ্যাসিঙ্ক) করুন এবং তারপরে ত্রুটি বার্তাটি দেখানোর জন্য বা প্রতিক্রিয়াটি পুনঃনির্দেশ করুন তবে আপনি উভয় সমস্যা এড়াতে পারবেন।
স্টিজন ডি উইট 21'17

61

আপনি যদি ব্রাউজারকে অবরুদ্ধ না করে উইন্ডো.ওপেনকে কল করতে পারেন তবেই যদি ব্যবহারকারী সরাসরি কোনও ক্রিয়া করেন। ব্রাউজারটি কিছু পতাকা প্রেরণ করে এবং ব্যবহারকারী কার্য দ্বারা খোলা উইন্ডোটি নির্ধারণ করে।

সুতরাং, আপনি এই পরিস্থিতিতে চেষ্টা করতে পারেন:

  1. var myWindow = window.open ('')
  2. এই উইন্ডোতে কোনও লোডিং বার্তা আঁকুন
  3. অনুরোধটি হয়ে গেলে, কেবল আমার উইন্ডো.লোকেশন = ' http://google.com ' কল করুন

4
এটি সাফারি মোবাইলে কাজ করে না (আইফোন 4 এ পরীক্ষিত)। আমি বেশ কয়েকটি অন্যান্য ধারণার চেষ্টা করেছি (উদাহরণস্বরূপ myWindow.postMessage) তবে ব্যাকগ্রাউন্ডে জাভাস্ক্রিপ্ট কার্যকর না করার সাফারিসের নিষেধাজ্ঞার কারণে, প্যারেন্ট উইন্ডো কখনই সেই অবস্থান পরিবর্তনটি প্রেরণ করতে পারে না।
রাউন্ড্রোবিন

@ বাউসবিগ আমি আইফোন 6, আইওএস 8-তে পরীক্ষা করেছি। এটি একটি মোহন মত কাজ করে।
lvarayut

পপআপ ব্লক না হয়ে গুগল অ্যানালিটিক্সের সাথে বাহ্যিক লিঙ্কগুলি ট্র্যাক করার একটি উপায় সন্ধান করছিল। এটি আমার প্রয়োজন ঠিক ছিল। আইওএস 7 (প্রকৃত ফোন) এবং আইওএস 8 (আইওএস সিমুলেটর) এর আইফোন 4 এস এ সূক্ষ্ম কাজ করার জন্য মনে হচ্ছে।
নোটাকচ

37

আমার এই সমস্যাটি ছিল এবং কলব্যাকটি কিছু ডেটা ফেরত দেবে ততক্ষণ আমার ইউআরএল প্রস্তুত নেই। সমাধানটি ছিল কলব্যাক শুরু করার আগে ফাঁকা উইন্ডোটি খুলতে এবং তারপরে কলব্যাক ফিরে আসার পরে কেবল অবস্থানটি সেট করে।

$scope.testCode = function () {
    var newWin = $window.open('', '_blank');
    service.testCode().then(function (data) {
        $scope.testing = true;
        newWin.location = '/Tests/' + data.url.replace(/["]/g, "");
    });
};

4
আমি এই সমাধানটি একটি নতুন উইন্ডো খোলার জন্য এবং পপআপব্লাইকারকে বাইপাস করতে ব্যবহার করেছি
VeldMuijz

যদি আমি পপআপ খোলার দরকার হয় তবে আমি যদি আগে জানতাম না? ইন হিসাবে: action().then(doWindowOpenThing).catch(doSomethingElseThatDoesntOpenAPopup) সুতরাং আমি হাতের আগে একটি উইন্ডো খুলতে পারি না (এর রেফারেন্স ইত্যাদি রাখতে) যদি পরে আমি এটি ব্যবহার না করি, তাই না?
লুইজ

না এটি প্রতিবারই একটি নতুন ট্যাব খুলবে এবং আমি অনুমান করি যে আপনি যেখানে এটি ব্যবহার করবেন না সে ক্ষেত্রে আপনি এটি চান না। বিষয়টি ব্রাউজারটি আপনাকে কেবল ক্লিক ফাংশনে একটি নতুন ট্যাব খোলার অনুমতি দেবে (ব্যবহারকারীর দ্বারা সূচিত ক্রিয়া) অন্যথায় পপআপ ব্লকার এটি ব্যবহারকারীর অনুমতি ছাড়াই নতুন ট্যাব খোলার স্ক্রিপ্ট হিসাবে দেখতে পাবে এবং এটিকে ব্লক করবে।
নুতুড়ো

দয়া করে, পরীক্ষা করুন যদি নতুন উইন শূন্য হয়!
ফ্রান্সেসকোএমএম

কেন? আমি এর কোন কারণ দেখছি না।
নুতুড়ো

18

এটি চেষ্টা করুন, এটি আমার পক্ষে কাজ করে,

$('#myButton').click(function () {
    var redirectWindow = window.open('http://google.com', '_blank');
    $.ajax({
        type: 'POST',
        url: '/echo/json/',
        success: function (data) {
            redirectWindow.location;
        }
    });
});

এই জন্য জড়ো হয় http://jsfiddle.net/safeeronline/70kdacL4/1/


4
ধন্যবাদ, আমার জন্যও কাজ করেছিল - যদি এই ফ্রিডল না হত তবে আমি সম্ভবত এটি বিশ্বাসই করতাম না, হেসে!
আরএমচারি

4
এটি গ্রহণযোগ্য উত্তর হওয়া উচিত! আপনার যদি ইউআরএল তৈরি করতে অ্যাসিঙ্ক ডেটা প্রয়োজন হয় তবে আপনি redirectWindow.location.assign ('new_url') ব্যবহার করতে পারেন।
গণিত


দয়া করে, পুনর্নির্দেশ উইন্ডো নাল হলে পরীক্ষা করুন! বিভিন্ন ব্রাউজার অপশন অনুযায়ী আপনি ব্লক করতে পারেন বা না করতে পারেন।
ফ্রান্সেসকোএমএম

8

উইন্ডোজ অবশ্যই ব্যবহারকারী-সূচিত ইভেন্ট হিসাবে একই স্ট্যাকের (ওরফে মাইক্রোটাস্ক ) তৈরি করতে হবে , যেমন একটি ক্লিক কলব্যাক - যাতে সেগুলি পরে তৈরি করা যায় না, অবিচ্ছিন্নভাবে।

তবে আপনি ইউআরএল ছাড়াই উইন্ডো তৈরি করতে পারেন এবং আপনি একবার জানার পরে সেই উইন্ডোটির ইউআরএল পরিবর্তন করতে পারেন এমনকি এমনকি অ্যাসিনক্রোনাক্রমেও!

window.onclick = () => {
  // You MUST create the window on the same event
  // tick/stack as the user-initiated event (e.g. click callback)
  const googleWindow = window.open();

  // Do your async work
  fakeAjax(response => {
    // Change the URL of the window you created once you
    // know what the full URL is!
    googleWindow.location.replace(`https://google.com?q=${response}`);
  });
};

function fakeAjax(callback) {
  setTimeout(() => {
    callback('example');
  }, 1000);
}

আধুনিক ব্রাউজারগুলি একটি ফাঁকা পৃষ্ঠা (প্রায়শই বলা হয় about:blank) দিয়ে উইন্ডোটি খুলবে এবং ইউআরএল পাওয়ার জন্য আপনার অ্যাসিঙ্ক কার্যটি ধরে নেওয়া মোটামুটি দ্রুত, ফলস্বরূপ ইউএক্স বেশিরভাগই ঠিক আছে। আপনি যদি তার পরিবর্তে উইন্ডোটিতে কোনও লোডিং বার্তা (বা কিছু) রেন্ডার করতে চান ব্যবহারকারী অপেক্ষা করার সময়, আপনি ডেটা ইউআরআই ব্যবহার করতে পারেন ।

window.open('data:text/html,<h1>Loading...<%2Fh1>');

3

এই কোডটি আমাকে সহায়তা করে। আশা করি এটি কিছু লোককে সহায়তা করবে

$('formSelector').submit( function( event ) {

    event.preventDefault();

    var newWindow = window.open('', '_blank', 'width=750,height=500');

    $.ajax({

        url: ajaxurl,
        type: "POST",
        data: { data },

    }).done( function( response ) {

        if ( ! response ) newWindow.close();
        else newWindow.location = '/url';

    });
});

3

কোনও লিঙ্ক উপাদান ব্যবহার করার চেষ্টা করুন এবং জাভাসক্রিপ্টের সাথে এটি ক্লিক করুন

<a id="SimulateOpenLink" href="#" target="_blank" rel="noopener noreferrer"></a>

এবং স্ক্রিপ্ট

function openURL(url) {
    document.getElementById("SimulateOpenLink").href = url
    document.getElementById("SimulateOpenLink").click()
}

এটি ব্যবহার করুন

//do stuff
var id = 123123141;
openURL("/api/user/" + id + "/print") //this open webpage bypassing pop-up blocker
openURL("https://www.google.com") //Another link

এটি আমার জন্য ফাঁকা উইন্ডো নিয়ে কাজ করা এড়ায়।
প্যান্ডার 275

দেখা গেল এটি আইফোনটি আমার উইন্ডোটিকে পপ-আপ হিসাবে ব্লক করে দেওয়ার ফলে আমার সমস্যার সমাধান হয়নি।
প্যান্ডার 275

2

ব্যবহারকারীর দ্বারা ইভেন্টটি যে পর্যবেক্ষণটি শুরু করতে হয়েছিল তা আমাকে এর প্রথম অংশটি সনাক্ত করতে সহায়তা করেছিল, কিন্তু এর পরেও ক্রোম এবং ফায়ারফক্স নতুন উইন্ডোটি অবরুদ্ধ করেছে। দ্বিতীয় অংশটি লিঙ্কটিতে লক্ষ্য = "_ ফাঁকা" যোগ করছিল, যা একটি মন্তব্যে উল্লেখ করা হয়েছিল।

সংক্ষিপ্তসার: আপনার উইন্ডো.পেন কল করতে হবে ব্যবহারকারী দ্বারা শুরু করা একটি ইভেন্ট থেকে, এই ক্ষেত্রে কোনও লিঙ্কে ক্লিক করা, এবং সেই লিঙ্কটিতে লক্ষ্য = "_ ফাঁকা" থাকা দরকার।

নীচের উদাহরণে লিঙ্কটি ক্লাস = "বোতাম-টুইটার" ব্যবহার করছে।

$('.button-twitter').click(function(e) {
  e.preventDefault();
  var href = $(this).attr('href');
  var tweet_popup = window.open(href, 'tweet_popup', 'width=500,height=300');
});


1

আমি আমার প্রতিক্রিয়া কোডে পপআপ ব্লকার এড়াতে এই পদ্ধতিটি ব্যবহার করছি। এটি অন্যান্য সমস্ত জাভাস্ক্রিপ্ট কোডগুলিতেও কাজ করবে।

আপনি যখন ক্লিক ইভেন্টে অ্যাসিঙ্ক কল করছেন, প্রথমে একটি ফাঁকা উইন্ডোটি খুলুন এবং তারপরে ইউএসএলটি পরে লিখুন যখন একটি অ্যাসিঙ্ক কল সম্পূর্ণ হবে।

const popupWindow = window.open("", "_blank");
popupWindow.document.write("<div>Loading, Plesae wait...</div>")

অ্যাসিঙ্ক কলের সাফল্যে, নিম্নলিখিত লিখুন

popupWindow.document.write(resonse.url)
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.