Diskuze: jQuery - problém
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.

Tvůrce

Zobrazeno 18 zpráv z 18.
//= Settings::TRACKING_CODE_B ?> //= Settings::TRACKING_CODE ?>
V předchozím kvízu, Online test znalostí JavaScript, jsme si ověřili nabyté zkušenosti z kurzu.
Si udělej proměnnou drzeno a tu v mousedown dej na true a v mouseup na
false Pak se na ni ptej v
mouseenter.
Udělal jsem toto :
$(document).ready(function(){
for(i=0; i<100;i++)
{
$('#divplace').append("<div class='item'></div>");
}
var drzeno = false;
$(document).mousedown(function(){
this.drzeno = true;
});
$(document).mouseup(function(){
this.drzeno = false;
});
if (drzeno == true)
{
$('.item').mouseenter(function(){
$(this).css('background','red')
});
}
});
ale nefunguje mi to ... poradil bys mi kde mám chybu ?
if (drzeno == true)
musíš mít v tom mouseenter a nejsem si jistý, jestli to tu proměnnou takhle uvidí. Můžeme být oškliví a udělat ji globální. Jinak bys to musel řešit asi přes objekty.
jojo .. udělal jsem to do toho .. čili takto :
var drzeno = false;
$(document).mousedown(function(){
this.drzeno = true;
if (this.drzeno == true)
{
$('.item').mouseenter(function(){
$(this).css('background','red')
});
}
});
$(document).mouseup(function(){
this.drzeno = false;
});
ale pořád když zvednu prst z myše tak barví ..
Zkus tohle:
drzeno = false;
$(document).mousedown(function(){
drzeno = true;
});
$(document).mouseup(function(){
drzeno = false;
});
$('.item').mouseenter(function(){
if (drzeno)
$(this).css('background','red')
});
Ta proměnná bez var je chápána jako globální, což je velmi ošklivé. Bohužel nevím, jak to jinak jednoduše vyřešit bez objektů a objekty nejsou v JS nic jednoduchého, takže pro začátek to je takhle asi lepší.
V HTML5 můžeme používat data atributy a jQuery nabízí metodu .data, která nastaví nebo předá uloženou hodnotu.
$('.item').data('drzeno', false);
$(document).mousedown(function(){
$('.item').data('drzeno', true);
});
$(document).mouseup(function(){
$('.item').data('drzeno', false);
});
$('.item').mouseenter(function(){
if ($(this).data('drzeno'))
$(this).css('background','red')
});
Rozhodně ne globální proměnnou Můžeš to aplikovat na kterýkoli prvek, ale mysli na to, že data
se váží právě k tomu jednomu prvku (resp. k tomu, ktrerý odpovídá CSS
selektoru). Nebo ještě lépe si vytvoř closure:
(function() {
// Tohle už není globální proměnná
// má platnost pouze v closure téhle anonymní funkce
var drzeno = false;
$(document).mousedown(function(){
drzeno = true;
});
$(document).mouseup(function(){
drzeno = false;
});
$('.item').mouseenter(function(){
if (drzeno)
$(this).css('background','red')
});
})();
// Vypíše undefined
console.log(drzeno);
Všechno mi funguje .. teď jsem narazil na snad poslední chybu a to tu, že
když nějak špatně chytíš myš a objeví se PŘEŠKRTNUTÉ KOLEČKO tak po
spuštění pořád myš barví .. nevíš jak tomuto zamezit ?
Netušil jsem, že to bude potom přístupné v těch eventech, tohle je
dobré
Protože se nevyvolá ta mouseup a drzeno zůstane na true. Jedině odchytnou nějakou tu událost drag and drop, podívej se do manu jquery, jestli na to něco má.
Scope funkce se dědí, ale o úroveň výš už dostupný (logicky) není
Když definuješ proměnnou ve
funkci, bude dostupná ve všech funkcích, co jsou uvnitř.
Honza Bittner zkus zakázat selection v CSS:
-webkit-touch-callout: none;
-webkit-user-select: none;
-khtml-user-select: none;
-moz-user-select: none;
-ms-user-select: none;
user-select: none;
bohužel, pořád to PŘEŠKRTLÉ KOLEČKO jde .. :/
http://www.favicon.cc/
tady to mají udělané také .. ale funguje jim to .. nevím proč to mě
dělá ty blbosti ..
Zobrazeno 18 zpráv z 18.