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'); }); } function submit_form( form, base_action) { alert ( event.target ); return; 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 |
#3 · Zasláno: 5. 6. 2013, 17:59:57
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" );"> 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(); } Napadá tě lepší řešení? (tydlety záplaty záplatovanejch záplat, to je dycky peklo :-)) |
||
Chamurappi Profil |
#4 · Zasláno: 5. 6. 2013, 18:25:42
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 |
#5 · Zasláno: 5. 6. 2013, 22:23:11
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 |
||
Časová prodleva: 11 let
|
0