1 .
Descripción y limitaciones
2 .
Lo primero es interceptar onMouseDown
3 .
El controlador de eventos
En Netscape 4 y Explorer 4 podemos impedir que aparezca el
menú cuando el usuario pulsa el botón derecho sobre una imagen y,
por tanto, impedir que puedan bajarse nuestras imágenes.
Descripción y limitaciones
Lo que haremos será interceptar el evento
onMouseDown, que ocurre cuando el usuario pulsa
un botón del ratón. Como lo que nos interesa es proteger
las imágenes, procuraremos interceptarlo sólo cuando pulse
sobre las mismas. Una vez interceptado, deberemos comprobar que el botón
pulsado sea el derecho, e impedir en caso afirmativo que aparezca el
menú. En este página, sin ir más lejos, está
funcionando este código. Intenta bajarte una de las imágenes
de arriba y verás.
Desafortunadamente, toda protección realizada con Javascript
es susceptible de ser eliminada simplemente configurando el navegador para
que no interprete Javascript. Nada es perfecto...
Lo primero es interceptar onMouseDown
Dado que lo que queremos es evitar que el usuario pulse sobre
una imagen, lo mejor será interceptar ese evento en las mismas. Y
eso es suficiente en Explorer. Sin embargo, y dado que muchas imágenes
sirven también como enlaces, en Netscape seguirá apareciendo el
menú cuando se de ese caso, por lo que deberemos interceptar también
ese evento en los enlaces. Podríamos hacerlo así:
<IMG SRC="..." onMouseDown="nuestroControladorDeEventos()">
Pero, claro, hacer eso con todas nuestras imágenes puede resultar,
como decirlo, aburrido. Así que lo mejor será hacer un script
que llame al controlador de evento cuando suceda onMouseDown
en cualquiera de las imágenes y enlaces del documento:
for (var i=0; i<document.images.length; i++)
document.images[i].onmousedown=noBotonDerecho;
if (document.layers)
for (var i=0; i<document.links.length; i++)
document.links[i].onmousedown=noBotonDerecho;
Supongo que los más avispados se habrán dado cuenta
de que nuestro controlador de eventos se va a llamar
noBotonDerecho. Hemos de indicar que éste
código sólo funciona en los navegadores de cuarta generación
(y siguientes) ya que fueron los primeros en soportar el evento que estamos
utilizando, onMouseDown. Por eso, para comprobar
rápidamente que utilizamos Netscape, preguntamos por la existencia
del vector document.layers, que sólo
aparece en dicho navegador.
Por último, queda la cuestión de donde colocar esta rutina.
Podemos hacer dos cosas. La primera es colocarla en una función que
sea llamada desde el evento onLoad, pero eso
tiene la desventaja de que el usuario podría bajarse imágenes
mientras la página no haya terminado de cargar pero en parte sea
ya visible. La otra opción, que recomiendo, es colocarlo al final
de la página, después de todas las etiquetas
IMG que pueda haber en la misma.
El controlador de eventos
Por último, una vez interceptado el evento, debemos comprobar
que el botón pulsado sea el derecho y evitar, si es así, que
aparezca el menú. Esto lo hará la siguiente función:
function noBotonDerecho(e) {
if (document.layers && (e.which == 3 || e.which == 2))
return false;
else if (document.all && (event.button == 2 || event.button == 3))
alert('No tiene usted permiso para intentar bajarse las imagenes');
return true;
}
Esta función recibe como parámetro un objeto
Event, que contiene información
sobre el evento interceptado, entre ella cuál de los botones
ha sido pulsado. Desafortunadamente, dicho objeto es distinto en Explorer
y en Netscape, por lo que deberemos acceder a él de manera distinta
según sea un explorador u otro.
En ambas versiones de objeto existe una propiedad que contiene el
botón pulsado. Esa propiedad, en caso de haber sido pulsado el
botón derecho, será 2 o 3 (dependiendo de si el ratón
tiene 2 o 3 botones). Pero, en el caso de Netscape, dicha propiedad se llamará
which y en el de Explorer,
button.
Por último, una vez comprobado que el botón pulsado
ha sido el derecho, debemos evitar que salga el menú. En Netscape
basta con que el controlador de evento devuelva
false, mientras que en Explorer lo que tenemos
que hacer es "distraer" al navegador obligandole a hacer otra cosa, por
ejemplo mostrar un mensaje de advertencia al usuario. Y con eso y un bizcocho...
hasta el próximo artículo.