Voyons quels problèmes surviendront lorsqu'il y aura des choses autour du drag précédent ? Il n'y aura aucun problème dans les navigateurs avancés. Testons-le sous IE7 et le problème apparaîtra. Comme le montre l'image
On voit bien que le texte a été sélectionné. Ensuite, cette expérience utilisateur est très mauvaise et peu pratique à utiliser. À propos, nous avons déjà ajouté un return false ; ce qui nous a aidé à résoudre de nombreux problèmes. Si nous le supprimons, le même problème se produira dans Chrome. Cela signifie donc que ce retour est faux ; peut résoudre le problème des navigateurs tels que Chrome ff IE9.
En fait, dans notre développement, il y aura de nombreux éléments sur la page. Il ne peut pas s'agir d'un seul div, d'autres endroits ne seront pas sélectionnés, comme Baidu Map.
Alors, comment pouvons-nous obtenir une telle traînée ? Cela peut-il résoudre le problème d’IE7 ?
Solution :
Nous pouvons utiliser une petite astuce pour le résoudre. Cette astuce n'est prise en charge que dans IE6-8 et peut réellement résoudre notre problème, car d'autres navigateurs utilisent return false ; Voyons quelles sont les techniques
C'est la capture d'événement ! ! Une brève explication et le code ci-joint
<title></title> <script type="text/javascript"> window.onload=function(){ var oBtn=document.getElementById("btn"); oBtn.onclick=function(){ alert(1); }; // 网页上所有地方的上的事件都集中到一个按钮身上 IE 专用 oBtn.setCapture(); // 点击哪里都是弹a } </script> </head> <body> <input type="button" id="btn" value="按钮" /> </body>
En fait, les événements de tous les endroits de la page sont concentrés en un seul point. En cliquant n'importe où sur la page, un pop-up apparaîtra, ce qui est la fonction de setCapture().
Concentrez tous les événements sur un seul bouton à gérer ! ! Ceci n'est compatible qu'avec IE ! !
Sur ce, laissez-moi voir comment modifier le code précédent. . . .
Nous remplaçons d'abord tous les documents en divs. Rappelez-vous ce que nous avons dit auparavant, à savoir qu'il est plus facile de faire glisser les divs car la souris glisse plus rapidement, nous ajoutons donc des événements aux documents.
Pas besoin de faire ça maintenant, ajoutez un setCapture() à notre div précédent pour voir l'effet.
<body> IE 7 中的文字会被选中 , <br />如果不加return false chrome ff 也会有这样的问题 asdsadad <br /> <div id="div1"> asdsadad asdsadad asdsadad </div> asdsadadasdsadadasdsadad </body>
<style type="text/css"> #div1 { width: 200px; height: 200px; background: red; position: absolute; } </style>
<script type="text/javascript"> // 拖拽空div 低版本的火狐有bug window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { var oEvent = ev || event; disX = oEvent.clientX - oDiv.offsetLeft; disY = oEvent.clientY - oDiv.offsetTop; oDiv.onmousemove = function(ev) { var oEvent = ev || event; var oDivLeft = oEvent.clientX - disX; var oDivTop = oEvent.clientY - disY; oDiv.style.left = oDivLeft + 'px'; oDiv.style.top = oDivTop + 'px'; }; oDiv.onmouseup = function() { oDiv.onmousemove = null; oDiv.onmouseup = null; }; oDiv.setCapture(); return false; // 阻止默认事件,解决火狐的bug }; }; </script>
À l’heure actuelle, nous n’avons pas de problème de faire glisser la Div avec la souris lorsque nous la faisons glisser. En fait, après avoir ajouté setCapture(), tous les événements de la page Web entière seront rassemblés sur ce div.
En fait, désormais, ce texte ne sera pas sélectionné. Pourquoi? Parce que tous les événements de texte et d'images sur la page web sont désormais sur le div, ils ne peuvent plus récupérer les événements ! Ils ne seront donc naturellement pas sélectionnés.
Bien sûr, il y a une autre question maintenant ? ? ? ? Vous constaterez que lorsque vous essayez de sélectionner ces mots, vous ne pouvez pas les sélectionner.
Que faire, les événements se concentrent sur la div. . . !!!!
Donc, en fait, ce setCapture() est comme un verrou. Maintenant, il est verrouillé. Les événements sont tous sur le div. Vous pouvez maintenant le déverrouiller.
releaseCapture(); consiste à libérer la capture. En fait, ajoutez-le simplement lorsque la souris est levée.
window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { var oEvent = ev || event; disX = oEvent.clientX - oDiv.offsetLeft; disY = oEvent.clientY - oDiv.offsetTop; oDiv.onmousemove = function(ev) { var oEvent = ev || event; var oDivLeft = oEvent.clientX - disX; var oDivTop = oEvent.clientY - disY; oDiv.style.left = oDivLeft + 'px'; oDiv.style.top = oDivTop + 'px'; }; oDiv.onmouseup = function() { oDiv.onmousemove = null; oDiv.onmouseup = null; oDiv.releaseCapture(); }; oDiv.setCapture(); return false; // 阻止默认事件,解决火狐的bug }; };
C'est très simple. Il suffit de fusionner le code cette fois et la dernière fois, c'est compatible. Enfin, le code compilé est joint
<script type="text/javascript"> window.onload = function() { var oDiv = document.getElementById("div1"); var disX = 0; var disY = 0; oDiv.onmousedown = function(ev) { var oEvent = ev || event; disX = oEvent.clientX - oDiv.offsetLeft; disY = oEvent.clientY - oDiv.offsetTop; if (oDiv.setCapture) { oDiv.onmousemove = mouseMove; oDiv.onmouseup = mouseUp; oDiv.setCapture(); // IE 7 下文字就不会被选中 其实就是文字或图片得不到事件 } else { document.onmousemove = mouseMove; document.onmouseup = mouseUp; } function mouseMove(ev) { var oEvent = ev || event; var oDivLeft = oEvent.clientX - disX; var oDivTop = oEvent.clientY - disY; oDiv.style.left = oDivLeft + 'px'; oDiv.style.top = oDivTop + 'px'; } function mouseUp(ev) { this.onmousemove = null; this.onmouseup = null; if (oDiv.releaseCapture) { oDiv.releaseCapture(); // 释放捕获 } } return false; // 阻止默认事件,解决火狐的bug }; }; </script>