Dank HTML5 gibt es modernen Browser drag und drop-Events, welche natives Drag & Drop ermöglichen. Es ist sogar vorgesehen, dass man das Bild (welches während eines Drag-Vorgangs angezeigt wird) ändern kann. Dazu muss man sich der setDragImage bedienen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <div id="wrapper"
style="width:200px;height:200px;background-color:blue;"
ondragstart="handleDragStart(event)">
</div>
<script type="text/javascript">
var divWrapper = document.getElementById('wrapper');
divWrapper.setAttribute('draggable', 'true'); // for Chrome
divWrapper.style.backgroundColor = 'red';
function handleDragStart(event)
{
// Drag Image
var image = document.createElement('img');
image.src = './images/logo.png';
// Event
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('text/html', this.innerHTML);
event.dataTransfer.setDragImage(image, -10, -10);
}
</script> |
Anstelle eines Bildes (img) ist es auch erlaubt das neue HTML5 canvas-Element einzusetzen:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <div id="wrapper"
style="width:200px;height:200px;background-color:blue;"
ondragstart="handleDragStart(event)">
</div>
<script type="text/javascript">
var divWrapper = document.getElementById('wrapper');
divWrapper.setAttribute('draggable', 'true'); // for Chrome
divWrapper.style.backgroundColor = 'red';
function handleDragStart(event)
{
// Drag Image
var canvas = document.createElement('canvas');
canvas.width = canvas.height = 100;
var context = canvas.getContext('2d');
context.fillStyle = 'rgb(255, 0, 255)';
context.fillRect(0, 0, canvas.width, canvas.height);
// Event
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('text/html', this.innerHTML);
event.dataTransfer.setDragImage(canvas, -10, -10);
}
</script> |
Hinweise:
- Damit ein Objekt die Drag-Eigenschaft aufweist, muss es das Attribut
draggable="true"erhalten - Damit das
draggable-Attribut auch im Safari funktionert, muss folgender CSS-Stil gesetzt werden:1 2 3 4 5 6 7
[draggable=true] { -webkit-user-select: none; -khtml-user-select: none; -moz-user-select: none; user-select: none; }
- Für den Mozilla Firefox ist es notwendig, dass es ein
ondragstart-Event gibt - Es muss zuerst
dataTransfer.setDataaufgerufen werden, damitdataTransfer.setDragImagefunktioniert dataTransfer.setDatakann im Firefox nur in einemondragstart-Event benutzt werdendataTransfer.setDragImageerwartet ein Bild und eine Position (x,y). Die Position gibt ausgehend vom Mauszeiger an, an welcher Stelle das Drag Image angezeigt wird- Der Google Chrome erlaubt kein
canvas-Element als Bild insetDragImage. Deshalb muss vorher dascanvas-Objekt mittoDataURLin eine BASE64-kodierte Zeichenkette umgewandelt werden:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <div id="wrapper"
style="width:200px;height:200px;background-color:blue;"
ondragstart="handleDragStart(event)">
</div>
<script type="text/javascript">
var divWrapper = document.getElementById('wrapper');
divWrapper.setAttribute('draggable', 'true'); // for Chrome
divWrapper.style.backgroundColor = 'red';
function handleDragStart(event)
{
// Drag Image
var image = new Image();
image.src = 'data:image/gif;base64,R0lGODlhCwALAIAAAAAA3pn/ZiH5BAEAAAEALAAAAAALAAsAAAIUhA+hkcuO4lmNVindo7qyrIXiGBYAOw==';
var canvas = document.createElement('canvas');
canvas.width = image.width;
canvas.height = image.height;
var context = canvas.getContext('2d');
context.drawImage(image, 0, 0);
var canvasImage = new Image();
canvasImage.src = canvas.toDataURL('image/png');
// Event
event.dataTransfer.effectAllowed = 'move';
event.dataTransfer.setData('text/html', this.innerHTML);
event.dataTransfer.setDragImage(canvasImage, -10, -10);
}
</script> |
Mit JavaScript ist es möglich ein Bild (image) dynamisch zu erstellen und einem Element (z.B. einem Div) zuzuweisen. Das folgende Code-Beispiel veranschaulicht diesen Effekt:
1 2 3 4 5 6 7 8 | <div id="wrapper"></div>
<script type="text/javascript">
var divWrapper = document.getElementById('wrapper');
var image = document.createElement('img');
image.setAttribute('src', './images/logo.png');
image.src = './images/logo.png'; // Alternative!
divWrapper.appendChild(image);
</script> |
Hinweis: Die Pfadangabe zum Bild kann absolut oder relativ (ausgehend vom HTML-Dokument!) sein.
Oft wünscht man sich in einem CSS-Layout einen Div-Container, welcher als Wrapper fungiert und 100 Prozent der im Browser zur Verfügung stehenden Höhe einnimmt. Möchte man dieses Verhalten browserkompatibel gestalten, ist das die Möglichkeit:
HTML
1 2 3 | <body> <div id="wrapper"></div> </body> |
CSS
1 2 3 4 5 6 7 8 9 10 11 12 13 | html, body { height: 100%; } div#wrapper { min-height: 100%; height: auto !important; height: 100%; background-color: seagreen; width: 300px; } |
Das JavaScript-Framework jQuery lässt sich ganz leicht mit eigenen Plugins erweitern. Wie das geht, seht ihr hier:
HTML-Code
1 2 3 4 5 6 7 8 9 10 11 12 | <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>jQuery Plugin Example</title>
</head>
<body>
<div id="my_div"></div>
<script src="./js/jquery.js"></script>
<script src="./js/my_jquery_plugin.js"></script>
</body>
</html> |
my_jquery_plugin.js
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | (function($) { $.fn.myPlugin = function(title, params) { var object = $(this); $.extend(object, params); alert(title); alert(object.greeting); alert(object.isReceived); return this; // to allow jQuery chaining } })(jQuery); $('#my_div').myPlugin('This comes from my jQuery plugin.', { greeting: 'Hello World!', isReceived: true }); |
my_jquery_plugin.js mit Standard-Einstellungen
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | (function($) { $.fn.myPlugin = function(params) { var settings = { firstName:'Max', lastName:'Mustermann' }; if (params) { $.extend(settings, params); } alert(settings.firstName+' '+settings.lastName); return this; } })(jQuery); $('#my_div').myPlugin({firstName:'Benny'}); |
my_jquery_plugin.js mit Funktionsnamen als Parameter
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 | (function($) { function myRedFunction(element, settings) { $(element).css({ width:'200px', height:'200px', backgroundColor:'red' }).html(settings.firstName+' '+settings.lastName); } $.fn.myPlugin = function(params) { var settings = { firstName:'Max', lastName:'Mustermann', callback:myRedFunction }; if (params) { $.extend(settings, params); } return settings.callback(this, settings); } })(jQuery); function myBlueFunction(element, settings) { $(element).css({ width:'200px', height:'200px', backgroundColor:'blue' }).html(settings.firstName+' '+settings.lastName); } $('#my_div').myPlugin({ firstName:'Benny', lastName:'Neugebauer', callback:myBlueFunction }); |
Eine gute Basis für ein jQuery-Plugin könnte wie folgt aussehen:
HTML-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 | <!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<title>My jQuery-Plugin</title>
<style type="text/css">
* { margin: 0; padding: 0; border: 0; }
html { background-color: wheat; }
#testdiv
{
width: 400px;
height: 400px;
background-color: sienna;
}
</style>
</head>
<body>
<div id="testdiv"></div>
<script src="./js/jquery.js"></script>
<script src="./js/my_jquery_plugin.js"></script>
<script type="text/javascript">
jQuery(document).ready(function($)
{
$('#testdiv').myPlugin();
});
</script>
</body>
</html> |
JavaScript Code-Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | (function($) { function mergeSettings(parameters) { var settings = { }; if (parameters) $.extend(settings, parameters); return settings; } $.fn.myPlugin = function(parameters) { var element = $(this); var settings = mergeSettings(parameters); alert('Plugin activated on: '+element.attr('id')); return element; } })(jQuery); |

0