2011-08-18 10 views
12

Recientemente me encontré con website that disabled text selection, impidiendo que cualquiera pueda copiar y pegar texto fácilmente. Tengo un bookmarklet que desactiva intentos similares de bloquear menús contextuales usando JavaScript, y me pregunto si sería posible hacer algo similar para la selección de texto.Activando la selección de texto bloqueado usando JavaScript

function disableSelection(target){ 
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false} 
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox 
    target.style.MozUserSelect="none" 
else //All other route (For Opera) 
    target.onmousedown=function(){return false} 
target.style.cursor = "default" 
} 

otros lugares, la función se llama con disableSelection(document.body).

La solución de mi menú contextual bookmarklet es también probable que sea necesario:

javascript:void(document.onmousedown=null); 
void(document.onclick=null); 
void(document.oncontextmenu=null) 

Por último, había visto elsewhere on StackOverflow que el CSS también se podría utilizar:

-webkit-user-select: none; 
-khtml-user-select: none; 
-moz-user-select: none; 
-o-user-select: none; 
user-select: none; 

¿Hay un método para luchar contra toda de estos a la vez y terminar esta tiranía sobre mi navegador? ¿Cómo habilitaría ambos MozUserSelect/SelectStart para todos los elementos y establecería las propiedades de CSS?

+0

Eso fue un downvote terriblemente rápido ... ¿alguna explicación? – Patrick

Respuesta

15

Me encontré con el mismo problema en una desagradable aplicación web que tengo que usar todos los días en el trabajo.

Intentamos escribir mi propio bookmarklet que overwride onselectstart controlador de eventos, pero no funcionó, al parecer debido a las reglas CSS adicionales que tuvieron que ser modificado.

Luego encontré el Enable All Text Selection bookmarklet by Alan Hogan que me solucionó el problema. El único problema con el bookmarklet es que no maneja fotogramas/iframes.

Como una ventaja adicional, también permite que el mouse haga clic derecho en las páginas que lo bloquean.

Crear un marcador (por ejemplo, arrastrando el icono a la izquierda de la dirección URL de cualquier página a la barra de marcadores), haga clic derecho y seleccione Edición, cambiar el nombre a algo significativo, e inserte el código siguiente en la URL campo:

javascript:(function(){function ats(){var styles='*,p,div{user-select:text !important;-moz-user-select:text !important;-webkit-user-select:text !important;}';jQuery('head').append(jQuery('<style />').html(styles));var allowNormal=function(){return true;};jQuery('*[onselectstart], *[ondragstart], *[oncontextmenu], #songLyricsDiv').unbind('contextmenu').unbind('selectstart').unbind('dragstart').unbind('mousedown').unbind('mouseup').unbind('click').attr('onselectstart',allowNormal).attr('oncontextmenu',allowNormal).attr('ondragstart',allowNormal);}function atswp(){if(window.jQuery){ats();}else{window.setTimeout(atswp,100);}}if(window.jQuery){ats();}else{var s=document.createElement('script');s.setAttribute('src','http://code.jquery.com/jquery-1.9.1.min.js');document.getElementsByTagName('body')[0].appendChild(s);atswp();}})(); 

Tiene limitaciones, sin embargo, en que no va a funcionar dentro de los marcos anidados.


..btw, para que el código legible bookmarklet, he utilizado el constructor en el Bookmarkelt http://subsimple.com/bookmarklets/jsbuilder.htm - sólo pega el siguiente texto bookmarklet minified y haga clic en el botón Formato; esta herramienta me ahorró mucho tiempo.

+0

¡Me alegro de que haya sido útil, y gracias por compartir el enlace del creador de marcadores! –

+0

si agrega también document.oncontextmenu = null; completará eso. – albanx

+0

Actualización: Este código fuente de marcador es ** en GitHub. ** Se ha mejorado y actualizado. Las solicitudes de extracción son bienvenidas! https://github.com/alanhogan/bookmarklets –

1

Los sitios web siempre pueden encontrar formas de ser desagradable. Todo lo que tienen que hacer es colocar imágenes transparentes sobre las cosas o poner texto en las imágenes y se ralentizará un poco.

Renunciar a preocuparse por ello. Firefox 4+ le da control sobre el clic derecho nuevamente para que las aplicaciones no puedan quitárselo. Si cree que un sitio es tan detestable, deje de usarlo y admita otro sitio que no sea tan desagradable o deje de tratar de tomar cosas que no quiere que tome. A menos que la página se construya dinámicamente desde JS, siempre puede obtener texto del origen de la página. Yo digo que deberías dejar de usar sitios que te molestan. Si todos hicieran eso, tendrían que cambiar sus formas.

+0

Soy consciente de que siempre puedo extraer texto de la fuente. Tenía la esperanza de escribir un bookmarklet para mí que resolvería estos problemas cuando surgieran, al igual que el botón de contexto bookmarklet que mencioné. – Patrick

+0

Te digo que probablemente puedas identificar una técnica específica utilizada para molestarte y encontrarle una solución alternativa, pero hay tantas maneras de molestar que no es factible intentar trabajar proactivamente en torno a todas ellas. por adelantado. Realmente no estoy interesado en rastrear una solución a la página que mencionaste. Es demasiado detestable. Yo no los frecuentaría. – jfriend00

+0

Cosas como imágenes transparentes, se resuelven fácilmente al deshabilitar la página CSS; He hecho un bookmarklet que "humaniza" una página mediante el establecimiento de colores estándar y tamaños de texto, así como la desactivación de la mayoría de las CSS. Permitirá, por ejemplo, guardar una imagen detrás de un gif transparente en flickr: https://gist.github.com/1485798 – ccpizza

2

Tenía el mismo problema con un sitio web.

CSS no puede resolver este problema ya que JavaScript entra en juego cada vez que prueba para seleccionar el texto.

Hay dos maneras de resolver esto 1) Deshabilitar Javascript en su navegador web. Mire esto como referencia. http://browsers.about.com/od/googlechrome/ss/disable-javascript-chrome-windows.htm 2) Abra la consola javascript. Estoy usando Chrome (haga clic en shift + comando + C en Mac, f12 en Ubuntu y Windows)

copie este código document.body.onselectstart = function() {return true;}; y péguelo en la consola, y presione enter.

+0

La respuesta aceptada no funcionó en Chrome. Pero document.body.onselectstart hizo el truco. ¡Gracias! – dtroy

0

visto el mismo JS molestos y más en otro sitio:

<script type="text/javascript" language="JavaScript"> 
function disableText(e){ 
    return false 
} 
function reEnable(){ 
    return true 
} 
//For browser IE4+ 
document.onselectstart = new Function ("return false") 

//For browser NS6 
if (window.sidebar){ 
    document.onmousdown = disableText 
    document.onclick = reEnable 
} 
</script> 
<script language="JavaScript1.2"> 
var msgpopup=""; 
function pmb(){ 
     if(alertVis == "1") alert(message); 
      if(closeWin == "1") self.close(); 
      return false; 
} 
function IE() { 
    if (event.button == "2" || event.button == "3"){pmb();} 
} 
function NS(e) { 
    if (document.layers || (document.getElementById && !document.all)){ 
      if (e.which == "2" || e.which == "3"){ pmb();} 
    } 
} 
document.onmousedown=IE;document.onmouseup=NS;document.oncontextmenu=new Function("alert(msgpopup);return false") 

</script> 
<script type="text/javascript"> 
function disableSelection(target){ 
if (typeof target.onselectstart!="undefined") //For IE 
    target.onselectstart=function(){return false} 
else if (typeof target.style.MozUserSelect!="undefined") //For Firefox 
    target.style.MozUserSelect="none" 
else //All other route (For Opera) 
    target.onmousedown=function(){return false} 
target.style.cursor = "default" 
} 

</script> 

Tenga en cuenta que todos los controladores de eventos están bien unidos a document manualmente y disableSelection(document.body). Por lo tanto, el script al que hace referencia @ alan-h que permite eventos de mouse también necesita ser actualizado para ejecutarse en document y document.body. (re: el.onselectstart = el.ondragstart = el.ondrag = el.oncontextmenu = el.onmousedown = el.onmouseup = function(){return true};)

Cuestiones relacionadas