mit eurer hilfe schwer erarbeitet, aber funktioniert nicht...
torsten
- javascript
moinmoin ihr alle,
vor nicht allzu langer zeit habt ihr mir den weg für das hier geebnet:
var myHandler = function() {
if(this.blur) {
this.blur();
}
}; // gepünktelten rahmen um link entfernen
window.onload = function() {
var toFocus = document.getElementById(window.location.hash.substr(1));
if (toFocus) {
toFocus.focus(); // link mit id="bla" fokussieren
for(var i=0;i<document.links.length;i++) {
document.links[i].onmouseup = myHandler; // beim loesen der maustaste rahmen um link entfernen (siehe variable myHandler)
}
}
}
das script soll den gepünktelten rahmen um angeklickte links beim lösen der maustaste entfernen, doch leider funktioniert das nicht. vorher sah das ding folgender maßen aus und beinhaltete den fehler einer funktion innerhalb eines loops:
window.onload = function()
{
// link mit id="bla" fokussieren
var toFocus = document.getElementById(window.location.hash.substr(1));
if (toFocus)
{toFocus.focus();
// beim loesen der maustaste rahmen um link entfernen
for(i=0;i<document.links.length;i++)
{
document.links[i].onmouseup=function()
{
if(this.blur)
{
this.blur();
}
};
}
}
};
das ist wohl aus verschiedenen gründen nicht ganz sauber, funktioniert aber prima in allen mir untergekommenen browsern... was ist da faul?
[latex]Mae govannen![/latex]
was ist da faul?
...daß du dem Nutzer eine vom Browser bereitgestellte Orientierungsmöglichkeit wegnehmen willst, egal ob es ihm passt.
Stur lächeln und winken, Männer!
Kai
Hallo,
was ist da faul?
...daß du dem Nutzer eine vom Browser bereitgestellte Orientierungsmöglichkeit wegnehmen willst, egal ob es ihm passt.
danke, ich habe gerade überlegt, wie ich das am besten formulieren sollte.
Ciao,
Martin
Hallo,
das ist wohl aus verschiedenen gründen nicht ganz sauber,
Kannst du diese Vermutung präzisieren? In welcher Hinsicht nicht sauber?
funktioniert aber prima in allen mir untergekommenen browsern...
Okay. Wie lautet nun deine Frage?
was ist da faul?
Gerade sagst du noch, es funktioniere prima. Was soll wo faul sein?
Mathias
moinmoin molily,
Hallo,
das ist wohl aus verschiedenen gründen nicht ganz sauber,
Kannst du diese Vermutung präzisieren? In welcher Hinsicht nicht sauber?
jsLint meckert sehr viel mehr aber im großen und ganzen lässt sich das folgender maßen zusammen fassen:
Error:
Problem at line 16 character 18: Don't make functions within a loop.
};
Implied global: window 1,4, i 8,10
das ganze bezieht sich auf das untere script ohne lokale variable myHandler
funktioniert aber prima in allen mir untergekommenen browsern...
Okay. Wie lautet nun deine Frage?
wieso funktioniert variante eins nicht?
was ist da faul?
Gerade sagst du noch, es funktioniere prima. Was soll wo faul sein?
zwei varianten, eine mit variable myHandler, eine ohne. inhaltlich aber quasi gleich. eine tut's, eine nicht, das bezeichne ich mal im jugendlichen überschwang als "faul" ;-)
Problem at line 16 character 18: Don't make functions within a loop.
Das ist eine Empfehlung. Du erzeugst immer wieder dieselbe Funktion in der Schleife. Das ist tatsächlich unnötig. Ist aber kein gravierendes Problem.
Implied global: window 1,4, i 8,10
i sollte eine lokale Variable sein.
wieso funktioniert variante eins nicht?
Tut sie das wirklich nicht? Sie ist in der Funktionalität identisch mit der zweiten. Sie dürfte sich ganz genauso verhalten.
In welchem Browsern unter welchen Umständen funktioniert nur die erste?
Mathias
moinmoin molily,
Problem at line 16 character 18: Don't make functions within a loop.
Das ist eine Empfehlung. Du erzeugst immer wieder dieselbe Funktion in der Schleife. Das ist tatsächlich unnötig. Ist aber kein gravierendes Problem.
Implied global: window 1,4, i 8,10
i sollte eine lokale Variable sein.
hm, dann muss ich mal versuchen das um zu basteln, das lohnt aber erst wenn ich rausfinde was nicht so geht wie ich's mir wünsche.
wieso funktioniert variante eins nicht?
Tut sie das wirklich nicht? Sie ist in der Funktionalität identisch mit der zweiten. Sie dürfte sich ganz genauso verhalten.
In welchem Browsern unter welchen Umständen funktioniert nur die erste?
nä, tut sie nicht ABER, und das ist mein irrtum, die andere auch nicht. hier kannst du das ganze online bestaunen, beim klick auf eins der bilder in der mitte geht das linkziel entweder im gleichen fenster/tab auf oder es öffnet sich ein neues UND der rahmen um das bild erscheint. selbst wenn ich den back-button benutze ist der rahmen noch da. hab den aktuellen IE und FF benutzt...
ominös, ich habe die funktion schon viele jahre am laufen, mir ist nie aufgefallen, das ich nur einen dummy eingebaut habe...
nä, tut sie nicht ABER, und das ist mein irrtum, die andere auch nicht. hier kannst du das ganze online bestaunen, beim klick auf eins der bilder in der mitte geht das linkziel entweder im gleichen fenster/tab auf oder es öffnet sich ein neues UND der rahmen um das bild erscheint.
Schau dir deinen Code mal genau an. Am besten rückst du den Code mal mit jsbeautifier.org ein, um die Verschachtelung der Kontrollstrukturen zu sehen. Du liest aus location.hash einen Wert und suchst anhand dessen ein Element im DOM. Wenn dieses existiert, so fokussierst du es in der Annahme, es hätte eine focus-Methode.
Falls das alles zutrifft und geklappt hat, dann durchläufst du alle Links und verpasst ihnen einen keyup-Handler. Was bedeutet, dass der Code nur ausgeführt wird, wenn die Seite mit #foo aufgerufen wird unter der Voraussetzung, dass foo die ID eines existierenden Elements ist. Dies trifft nicht zu, wenn ich einfach die obige Seite aufrufe.
Im Übrigen sehe ich dort keinen Link mit target="_blank" oder ähnliches, außerdem bin ich gerade an einem Mac und die dortigen Browser heben Links beim Klicken nicht mit eine Umrandung hervor (ob mit oder ohne dein Script).
Davon abgesehen gibt es die CSS-Eigenschaft http://de.selfhtml.org/css/eigenschaften/rahmen.htm#outline@title=outline, welche in neueren Browsern die Umrandung von fokussierten Links regelt (a:focus, a:active). JavaScript ist dafür eigentlich nicht nötig.
Mathias
moinmoin molily,
nä, tut sie nicht ABER, und das ist mein irrtum, die andere auch nicht. hier kannst du das ganze online bestaunen, beim klick auf eins der bilder in der mitte geht das linkziel entweder im gleichen fenster/tab auf oder es öffnet sich ein neues UND der rahmen um das bild erscheint.
Schau dir deinen Code mal genau an. Am besten rückst du den Code mal mit jsbeautifier.org ein, um die Verschachtelung der Kontrollstrukturen zu sehen.
schönes tool...
Du liest aus location.hash einen Wert und suchst anhand dessen ein Element im DOM. Wenn dieses existiert, so fokussierst du es in der Annahme, es hätte eine focus-Methode.
voooorsicht, diese annahme hatte nicht ich, denn so etwas kann ich nicht annehmen, mir fehlen noch die voraussetzuingen.
Falls das alles zutrifft und geklappt hat, dann durchläufst du alle Links und verpasst ihnen einen keyup-Handler. Was bedeutet, dass der Code nur ausgeführt wird, wenn die Seite mit #foo aufgerufen wird unter der Voraussetzung, dass foo die ID eines existierenden Elements ist. Dies trifft nicht zu, wenn ich einfach die obige Seite aufrufe.
ok, das erklärt aber wozu ich die funktion tatsächlich benötige :) danke für deine erklärung! ich verschicke nämlich an meine pucklige verwandschaft und freunde, die ich mir ausgesucht habe und freunde, die mich ausgesucht haben links in dieser art: http://jungmann.net/#nopuresw und diese hübsche funktion fokusiert diese teile, so dass sie die mitgegebenen css eigenschaften erhalten und alle sehen was ich ihnen meinen will :) subba!
Im Übrigen sehe ich dort keinen Link mit target="_blank"
musst du auch nicht, denn das hängt doch auch von den einstellungen im browser ab...
oder ähnliches, außerdem bin ich gerade an einem Mac und die dortigen Browser heben Links beim Klicken nicht mit eine Umrandung hervor (ob mit oder ohne dein Script).
das ist mal echt cool und nimmt den ganzen "...daß du dem Nutzer eine vom Browser bereitgestellte Orientierungsmöglichkeit wegnehmen willst, egal ob es ihm passt." verfechtern die luft aus den segeln, denn schließlich gibt's auch noch andere möglichkeiten den surfer auf das aufmerksam zu machen, was er genau so gut aus seiner erinnerung kramen könnte...
Davon abgesehen gibt es die CSS-Eigenschaft http://de.selfhtml.org/css/eigenschaften/rahmen.htm#outline@title=outline, welche in neueren Browsern die Umrandung von fokussierten Links regelt (a:focus, a:active). JavaScript ist dafür eigentlich nicht nötig.
javascript ist kein bisschen fuuuuubaaaar! allerdings liegt mir css wesentlich besser und was soll ich sagen, (?) das funktioniert geradezu oberprima!
thx