8
votes

$ (fenêtre) .blur événement affectant iframe

Je veux détecter lorsque l'utilisateur quitte ma page (E.g Ouvrir un nouvel onglet) afin que je puisse arrêter un compte à rebours. Je l'ai fait en utilisant: xxx pré>

mais j'ai un iframe à l'intérieur de ma page et que le compte à rebours s'arrête également lorsque l'utilisateur clique dessus, mais je ne veux pas que l'événement ci-dessus soit exécuté lorsque quelqu'un clique sur Sur l'iframe. P>

Une idée? P>

Mise à jour, j'essaie un peu plus, en fonction de cette réponse CLIQUE-Evénement sur iframe? : P>

if ($('iframe').is(':focus')) {
    // dont stop countdown
    $("iframe").blur()
    $(window).focus();
}


3 commentaires

Qu'est-ce qui est dans votre iframe?


Le site Web externe DOM.


J'ai résolu un problème très similaire au vôtre, voir ma réponse à Stackoverflow.com/questions/9880193/...


3 Réponses :


1
votes

En raison de l'isolement de l'iframe, en cliquant à l'intérieur, il compte comme flou pour le parent. Si le contenu de l'iframe pourrait être apporté avec Ajax, ce serait une meilleure option.


2 commentaires

Cela serait compliqué puisque l'utilisateur peut naviguer à l'intérieur iframe. Je ne peux pas supprimer l'événement de flou si l'utilisateur clique-t-il dans l'iframe? J'ai mis à jour ma question, s'il vous plaît, donnez-lui un coup d'oeil.


Voir Stackoverflow.com/Questtions/2381336/...



5
votes

Une solution serait de vérifier si l'IFrame a la mise au point et ne pas arrêter la minuterie. E.G.

<script>

    function setFocus() {
        // focus on an element on your page.
        $('an-element-on-your-page').focus();
    }

    $(function () {

        $(window).focus(function (e) {
            // bind the blur event
            setBindingEvent();
        });

        var setBindingEvent = function () {
            // unbind
            $(window).unbind('blur');
            $(window).blur(function () {
                // check focus
                if ($('iframe').is(':focus')) {
                    // unbind the blur event
                    $(window).unbind('blur');
                }  
                else {
                    // stop countdown
                }                
            });
        };

        setBindingEvent();

    });
</script>


3 commentaires

Ça a marché. Merci! Maintenant, j'essaie de supprimer la mise au point de l'iframe. J'ai mis à jour ma question si vous voulez vérifier, car cela ne fonctionne pas. J'apprécie vraiment votre aide, merci.


Merci pour l'aide à nouveau. Mais le script à l'intérieur de l'iframe ne fonctionne pas, est-ce que ça va de mettre une étiquette de script à l'intérieur iframe comme ça?


J'ai édité votre réponse à votre première car cela fonctionne de manière simple et simple et je n'ai pas pu reproduire votre deuxième :)



0
votes

J'ai le même problème. Dans mon cas, je n'ai pas accès à la page Iframe et à sa charge par CMS et je ne peux pas changer tous les iframes. Ma minuterie comptant avec seinterval () et à l'intérieur de l'intervalle, je vérifie l'iframe.

p>

const focus = function() {
	// timer start
	isBlured = 0;
};

const blur = function() {
  // timer stop
  isBlured = 1;
}

window.addEventListener('focus', focus);
window.addEventListener('blur', blur);

function intervalFunction() {
 
  var activeELM = document.activeElement.tagName;

  if (isBlured == 0 || activeELM == "IFRAME"){
      // dont stop countdown
    	var stopIframe = $('iframe').blur();     
  }
  
}


0 commentaires