Autor Zpráva
SwimX
Profil
Ahoj,

musím opravit web, který má stařičké javascripty (a ne uplně dobře napsané). Odesílací tlačítko volá funkci submit_form, které předává element formulář.
Bohužel, občas jako document.main, občas document.getElementById i když má formulář jen name a podobně. Netuším, jak je možné, ale doteď to ve všech verzích IE (jinde to není potřeba) fungovalo, až IE 10 se (právem) vzteká.

Jelikož nechci ani moc nemůžu opravovat tato volání v desítkách souborů, chtěl jsem upravit jen funkci submit_form na jednom místě. Původní plán byl asi toto:
[pre javascript]
function submit_form( form, base_action) {
    if ( ! form ) {
        $(document).click(function(event) {
            form = $(event.target).parents('form:first');
        });
    }
ale to je samozřejmě nesmysl. Tak jsem si řekl,

function submit_form( form, base_action) {

        alert ( event.target );
    return;
    
ale to vcrací undefined, myslel sem, že (aniž bych někde registroval co dělat s události click) se mi naplní event.target kliknutým prvek, asi ne..?

co by mělo fungovat (asi, nezkoušel jsem) je
<body>
  <script>
      var elClicked = undefined;
      $(document).click(function(event) {
         elClicked= event.target;
      });
   </script>
   
   ...
   function submit_form( form, base_action) {
     alert ( elClicked ); // by měl být naplněn, snad

je to správné řešení? Edit tak to samozřejmě také nefunguje, nejdřív se mi vyvolá funkce submit_form a až potom ten event handler :-(

Díky za rady


Tak jsem vygooglil
function getEventTarget(event) {
     var targetElement = null;
     try {
         if (typeof event.target != "undefined") {
             targetElement = event.target;
         }
         else {
             targetElement = event.srcElement;
         }
         // just make sure this works as inteneded
         if (targetElement != null && targetElement.nodeType && targetElement.parentNode) {
             while (targetElement.nodeType == 3 && targetElement.parentNode != null) {
                 targetElement = targetElement.parentNode;
             }
         }
     } catch (ex) { alert("getEventTarget failed: " + ex); }
     return targetElement;
 };

což funguje
function submit_form( form, base_action) {
    if ( ! form ) {
        form = $(getEventTarget(event)).parents('form:first');
    }

je to vyloženě špatně?
Chamurappi
Profil
Reaguji na SwimXe:
A co vlastně chceš dělat? Třeba by šlo najít lepší postup, kdybychom věděli víc…
Pokud je zpracování událostí napsané v atributech, tak jde zrušit/přepsat.

Netuším, jak je možné, ale doteď to ve všech verzích IE (jinde to není potřeba) fungovalo, až IE 10 se (právem) vzteká.
V quirku a v Explorerech do verze 7 včetně umí document.getElementById hledat i podle name (ale jen elementy, které smí mít name). Explorer 10 má nový quirk, který je odvozený od quirků ostatních prohlížečů.
Přepnout se do staršího quirku (jaký byl cca v Exploreru 7) by mělo jít <meta> značkou:
<meta http-equiv="X-UA-Compatible" content="IE=5">

myslel sem, že (aniž bych někde registroval co dělat s události click) se mi naplní event.target kliknutým prvek, asi ne..?
Naplní se event.srcElement. To je event.target přeložený z netskejpovštiny do explorerštiny.
SwimX
Profil
Chamurappi:
Naplní se event.srcElement
to je přesně ono, supr.

Přepnout se do staršího quirku (jaký byl cca v Exploreru 7) by mělo jít <meta> značkou
to mi vubec nedošlo, to by možná řešilo uplně vše..

A co vlastně chceš dělat?
Několik webů co má staré administrační rozhraní přestalo fungovat v IE 10. Někde ve skriptech je
<input type="button" onclick="...; submit_form ( document.main, "neco" );">
jinde je zase ten getElementById (ale form nemá id) a podobně, todle nejde opravovat, toho je moc.

tedy já mám funckci:
function submit_form( form, base_action) {
    form.target = "_self";
    if(tab != -1 && !base_action.match(/[&\?]tab=[0-9]+/)) base_action += '&tab=0';
    form.action = base_action.replace(/([&\?])tab=[0-9]+/, '$1tab=' + tab);
    form.submit();
} 

do které občas propadne v form null. Následně to hodí chybu a formuláře se neposílají. Zadání: opravit :-)

udělal jsem tedy
function submit_form( form, base_action) {
    if ( ! form ) {
        form = $(getEventTarget(event)).parents('form:first');
    }
    
    form.target = "_self";
    if(tab != -1 && !base_action.match(/[&\?]tab=[0-9]+/)) base_action += '&tab=0';
    form.action = base_action.replace(/([&\?])tab=[0-9]+/, '$1tab=' + tab);
    form.submit();
} 
getEventTarget viz [#1]. Zvažuju ten meta tag, možná tam dám oboje.

Napadá tě lepší řešení? (tydlety záplaty záplatovanejch záplat, to je dycky peklo :-))
Chamurappi
Profil
Reaguji na SwimXe:
to mi vubec nedošlo, to by možná řešilo uplně vše..
Je to dost pravděpodobné.

Někde ve skriptech je
Zrovna document.main je ideální cesta k formuláři s name="main". To funguje a bude fungovat navždy.

jinde je zase ten getElementById (ale form nemá id) a podobně, todle nejde opravovat, toho je moc
Možná to nejde opravovat ručně. Ale skriptem jo — po načtení stránky můžeš projet všechny formuláře v document.forms cyklem a nastavit jim id shodné s name.

tydlety záplaty záplatovanejch záplat, to je dycky peklo :-)
S tím mám docela dost zkušeností. Není to zase takové peklo, člověk si při tom uvědomí, jak málo se ty zásadní části JavaScriptu a DOMu mění, většinou totiž stačí velmi drobné zásahy k tomu, aby i patnáct let stará hrůza fungovala další desetiletí. Největší zlo jsou stránky, kam někdo před šesti lety zatáhnul tehdejší verzi jQuery nebo MooTools, která zlobí v dnešních prohlížečích a za novou ji nejde vyměnit. Tam se musí buď vyrobit osekaná napodobenina frameworku, nebo najít příčinu uvnitř něj a tu opravit/vyřadit.
SwimX
Profil
Chamurappi:
po načtení stránky můžeš projet všechny formuláře v document.forms cyklem a nastavit jim id shodné s name.
ach jo, jak já sem nenápaditý :-) To by totiž asi řešilo (už po druhé) vše.

Díky ti

Vaše odpověď

Mohlo by se hodit

Neumíte-li správně určit příčinu chyby, vkládejte odkazy na živé ukázky.
Užíváte-li nějakou cizí knihovnu, ukažte odpovídajícím, kde jste ji vzali.

Užitečné odkazy:

Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm: