Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 11
  1. #1
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78

    Problema con Internet Explorer: sostituzione stringhe in DOM

    Innanzi tutto scusate per il titolo generico, ma non sapevo come formulare la richiesta in poche parole.

    Io uso un programmino che sostituisce, nella classe "smiley", gli emoticon con la gif dello smiley corrispondente e che cancella automaticamente quello che viene scritto nella classe "spam". Per non creare conflitti con altri script ho anche usato la funzione addLoadEvent.

    Il problema è che funziona bene con tutti i browser tranne IE, che ci mette minuti a caricare, si pianta, va in crash, di tutto di più.

    Qualcuno per favore ha la pazienza di leggerlo e dirmi cosa sbaglio e cosa devo cambiare?


    Il programma è questo, caricato come <script type='text/javascript' src="URL/commenti.js" /> nella pagina del mio blog:

    codice:
    document.getElementsByClassName = function(clsName) {
        var retVal = new Array();
        var elements = document.getElementsByTagName('*');
        for (var i = 0 ; i < elements.length ; i++) {
            if (elements[i].className.indexOf(' ') >= 0) {
                var classes = elements[i].className.split(' ');
                for(var j = 0;j < classes.length;j++){
                    if(classes[j] == clsName)
                        retVal.push(elements[i]);
                }
            }
            else if (elements[i].className == clsName)
                retVal.push(elements[i]);
        }
        return retVal;
    }
    
    
    function gest_spam() {
        var b = [];
        var i=0;
        var cla = ['spam'];
    
        for (i=0 ; i<cla.length ; i++) {
    	var content = document.getElementsByClassName(cla[i]);
    	for (var k=0 ; k<content.length ; k++)
    		b.push(content[k]);
        }
    
        for (i=0 ; i<arguments.length ; i++) {
    	var content = document.getElementsByClassName(arguments[i]);
    	for (var n=0 ; n<content.length ; n++)
    		b.push(content[n]);
        }
    
        for (i=0 ; i<b.length ; i++) { 
           b[i].innerHTML = b[i].innerHTML.replace(/.+/ig, '');
        }
    }
    
    
    function gest_emoticon() {
        var d = [];
        var i=0;
        var def = ['smiley'];
    
        for (i=0 ; i<def.length ; i++) {
    	var content = document.getElementsByClassName(def[i]);
    	for (var j=0 ; j<content.length ; j++)
    		d.push(content[j]);
        }
    
        for (i=0 ; i<arguments.length ; i++) {
    	var content = document.getElementsByClassName(arguments[i]);
    	for (var m=0 ; m<content.length ; m++)
    		d.push(content[m]);
        }
    
        for (i=0 ; i<d.length ; i++) { 
    
            d[i].innerHTML = d[i].innerHTML.replace(/:-?\)/g,  ' [img]URL_GIF_1[/img] ');
            d[i].innerHTML = d[i].innerHTML.replace(/:-?\(/g,  ' [img]URL_GIF_2[/img] ');
            .........
        }
    }
    
    
    function addLoadEvent(func) {
        var oldonload = window.onload;
    
        if (typeof window.onload != 'function') {
             window.onload = func;
        }
        else {
             window.onload = function() {
                if (oldonload)   oldonload();
                func();
             }
        }
    }
    addLoadEvent (gest_emoticon);
    addLoadEvent (gest_spam);

  2. #2
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78
    Proprio nessuno che ha qualche suggerimento? Oppure non ci sono suggerimenti perché il programma è scritto giusto?

    Mal che vada, qualcuno può dirmi come aggiungere nel programma un'istruzione che dica "Se il browser usato è IE, salta questa funzione (o queste istruzioni)"?

  3. #3
    Originariamente inviato da axlman
    Proprio nessuno che ha qualche suggerimento? Oppure non ci sono suggerimenti perché il programma è scritto giusto?
    a dire il vero da quello che leggo è tutto un pò sbagliato ... ma non mi piacciono i copia e incolla da una ricerca google senza credits nel codice (document.getElementsByClassName, per altro errata, deprecata, intrusiva, dato che molti browsers la implementano per conto loro, molti di quelli che dici supportano il resto dello script) ...

    Originariamente inviato da axlman
    Mal che vada, qualcuno può dirmi come aggiungere nel programma un'istruzione che dica "Se il browser usato è IE, salta questa funzione (o queste istruzioni)"?
    codice:
    if(+"\v1"){
        alert("tutti tranne IE");
    };
    oppure
    codice:
    if(/*@cc_on !@*/1){
        alert("tutti tranne IE");
    };
    ciao
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  4. #4
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78
    Originariamente inviato da andr3a
    a dire il vero da quello che leggo è tutto un pò sbagliato ... ma non mi piacciono i copia e incolla da una ricerca google senza credits nel codice (document.getElementsByClassName, per altro errata, deprecata, intrusiva, dato che molti browsers la implementano per conto loro, molti di quelli che dici supportano il resto dello script) ...
    Ti ringrazio per la risposta ma non l'ho capita del tutto, tipo la faccenda dei credits. Per fare quello che volevo ho trovato document.getElemensByClassName e quella ho usato, esattamente come ho usato addLoadEvent: io uso quello che trovo, non essendo un mago del codice, se non ci sono credits dove trovo un programma, come faccio a usarli? E comunque anche se ci fossero, non mi sembrerebbe il caso di metterli per farmi consigliare su un codice: non si deve scrivere il minimo indispensabile, per cercare aiuto?

    Comunque mi dici che document.getElemensByClassName è brutta, sporca e cattiva, ma non mi dici con cosa sostituirla; dici che molti browser la implementano per conto loro, ma io ho trovato solo pagine dove dicono che NON è implementata e mi sono adeguato. Sicuramente ignoranza mia, ma a questo punto potresti per cortesia indicarmi come modificare il programma usando il document.getElemensByClassName implementato nei browser?

    Grazie ancora e ciao.

  5. #5
    Originariamente inviato da axlman
    Ti ringrazio per la risposta ma non l'ho capita del tutto, tipo la faccenda dei credits. Per fare quello che volevo ho trovato document.getElemensByClassName e quella ho usato, esattamente come ho usato addLoadEvent: io uso quello che trovo
    e quello che trovi è perchè qualcuno l'ha messo li per aiutare gli altri. Quel qualcuno al 99% avrà come minimo il requisito credits nel codice.

    In rete si impara molto, spesso più che all'università, se parliamo di IT, ma è solo grazie a gente che ha perso tempo ad imparare/capire che si impara, e copiare ed incollare scartando i credits è una mossa "furba" alla "l'ho fatto io" ... son certo tu non l'abbia fatto con cattiveria, ma di gente che usa software terzi appropriandosene ce n'è a bizzeffe e tutti coloro che contribuiscono alla diffusione di informazioni, codici, altro, in rete, odiano coloro che si appropriano dei loro codici.

    Non è difficile, si mette un link almeno di dove si ha preso la funzione, no che si strippano via credits e ci si dimentica della fonte ... senza quella fonte non avresti potuto imparare o copiare e incollare, pratica che comunque non condivido poichè almeno io vorrei capire cosa faccio ed imparare altrimenti mi sento una scimmia, ma se tutti facessero così l'informazione gratuita, il rispetto di chi lavora ma condivide, va a farsi benedire, e nessuno potrà più copiare ed incollare, il che sarebbe anche giusto, se non fosse che alcuni di noi ancora hanno "stupidi ideali" sull'open source e le licenze dietro.

    E' un discorso generale, non necessariamente rivolto a te (anche rivolto a te in questo caso)


    [edit del seguito]
    Originariamente inviato da axlman
    Comunque mi dici che document.getElemensByClassName è brutta, sporca e cattiva, ma non mi dici con cosa sostituirla;
    perchè non mi piace il modo in cui riusi codice altrui ... ci sono mille migliori implementazioni di quella

    Originariamente inviato da axlman
    dici che molti browser la implementano per conto loro, ma io ho trovato solo pagine dove dicono che NON è implementata e mi sono adeguato.
    uuuh, cosa c'è qui, firefox???
    https://developer.mozilla.org/en/DOM...ntsByClassName
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  6. #6
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78
    Allora, se io trovo i credits li copincollo, se non ci sono e mi trovo uno che dice «Io uso questo» senza dire chi l'ha scritto, non me lo posso inventare, né mi sembra il caso di attribure a lui la paternità della cosa. Men che meno mi sembra il caso, chiedendo aiuto, di ficcare dentro il codice da esaminare parti inutili come i credits.
    Detto ciò se mi aiuti a sistemare il codice prometto che come credit metto il tuo nome e l'url di questo thread, va bene così? Quindi mi diresti, per favore e se lo sai, cosa devo cambiare per far funzionare il codice con IE?
    Grazie.

  7. #7
    non ho idea di quali altre libs tu stia usando ... tu dici di non creare conflitti ma io non ne sono certo.

    Non so su quale layout stai lavorando

    stai modificando innerHTML, pericolosissimo per svariati motivi ... in più lo modifichi per togliere tutto piuttosto che rimuovere i nodi incriminati via DOM ma peggio ancora con un innerHTML se hai rimosso un nodo che era dentro un altro fai ovviamente un casino.

    Esempio

    <div class="spam"><div class="spam"></div></div>

    getElementsByClassName ti darà 2 nodi spam, tu al primo fai innnerHTML = replace(/.+/, "");
    che è un nonsenso assoluto perchè al limite basta fare
    innnerHTML = ""; invece di cercare tutto per rimuoverlo

    e il secondo nodo? beh, era dentro il primo, non esiste più, cosa ti aspetti di farci adesso?

    non so come stai chiamando le funzioni, ci sono argomenti gestiti ma non so quali, l'errore potrebbe essere ovunque ma quel poco che c'è è già logicamente errato

    Dici che hai altri script? Beh, se hai jQuery e vuoi aggiungere smile usa jSmile e pace, altrimenti studia JavaScript e cerca di creare uno script logico e adatto per il tuo caso.

    http://plugins.jquery.com/project/JSmile

    buona notte
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

  8. #8
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78
    Originariamente inviato da andr3a
    perchè non mi piace il modo in cui riusi codice altrui
    Aridanghe... Ma che ne sai di come uso il codice altrui? Ti ho scritto e riscritto che chiedendo aiuto tolgo tutto il superfluo, che mi pare proprio sia una regola di buona educazione, in questi casi. Cos'è, se ci infilo i credits il programma si mette a funzionare? Senza quelli non si può dire cosa è sbagliato e cosa no?
    Sembra che mi rispondi per litigare, invece che per aiutare...


    Originariamente inviato da andr3a
    ... ci sono mille migliori implementazioni di quella
    A me ne basta una, se qualcuno fosse così gentile da indicarmela.


    Originariamente inviato da andr3a
    uuuh, cosa c'è qui, firefox???
    https://developer.mozilla.org/en/DOM...ntsByClassName
    Come avevo scritto, io non avevo trovato un'implementazione, non ho detto che non esistesse, quindi c'è poco da fare il sarcastico. Detto ciò il mio problema è con IE, non con FF: quella istruzione funziona con IE? Per far funzionare le cose con IE che devo fare?
    Chiedo perché non lo so e no riesco a trovare riscontri, non per farmi prendere in giro: se ci godi a fare ironia con chi ne sa meno di te e così sentirti superiore, accomodati pure, basta che dai una mano concreta. Lo chiedo sempre per favore, che finora non mi sembra di essere stato maleducato o strafottente né con te né con altri.

    Originariamente inviato da andr3a
    non ho idea di quali altre libs tu stia usando ... tu dici di non creare conflitti ma io non ne sono certo.
    Non ho detto che di sicuro non creo conflitti, ho detto che usando addLoadEvent pensavo di evitare possibili conflitti: io avevo capito servisse a quello, se mi sbaglio basta dirlo.


    Originariamente inviato da andr3a
    Non so su quale layout stai lavorando

    stai modificando innerHTML, pericolosissimo per svariati motivi ...
    Lavoro sulla piattaforma Blogger e se uso gli innerHTML è perché non c'è altro modo: i commenti li gestisce Blogger, nei commenti non c'è neanche modo di inserire tag HTML (tranne [b], [i] e <a href="">), lui stampa il commento prendendolo dai suoi database e io non posso intervenire in alcun modo per modificarlo, inserendo gli smiley o cancellandolo, se non usando innerHTML: non mi complico la vita per niente.


    Originariamente inviato da andr3a
    in più lo modifichi per togliere tutto piuttosto che rimuovere i nodi incriminati via DOM ma peggio ancora con un innerHTML se hai rimosso un nodo che era dentro un altro fai ovviamente un casino.

    Esempio

    <div class="spam"><div class="spam"></div></div>
    Sono stato attento: un commento o è nella classe smiley oppure nella classe spam, senza mettere i nodi uno dentro l'altro, in nessun caso.


    Originariamente inviato da andr3a
    fai innnerHTML = replace(/.+/, "");
    che è un nonsenso assoluto perchè al limite basta fare
    innnerHTML = ""; invece di cercare tutto per rimuoverlo
    OK, non ci avevo pensato, modifico subito.


    Originariamente inviato da andr3a
    non so come stai chiamando le funzioni, ci sono argomenti gestiti ma non so quali, l'errore potrebbe essere ovunque ma quel poco che c'è è già logicamente errato
    Gli argomenti sono ognuno una stringa, che contiene il commento inviato.

    Di aiutarmi a migliorare la logica del programma, ne hai voglia, per favore? No perché «studia JavaScript e cerca di creare uno script logico e adatto per il tuo caso» come hai scritto tu, capirai non è un grande aiuto: se alla domanda «Dove sbaglio, chi mi aiuta a migliorare questo programma» tutti rispondessero «studiati JS e scriviti un programma che funzioni» questo forum e altri forum simili non avrebbero ragione di esistere.


    Originariamente inviato da andr3a
    studia JavaScript e cerca di creare uno script logico e adatto per il tuo caso.
    buona notte
    E sogni d'oro...

  9. #9
    Utente di HTML.it
    Registrato dal
    Jun 2008
    Messaggi
    78
    Non capivo perché mi parlassi di roba poco logica, visto che il programma, per la parte scritta da me è parecchio lineare, quindi sono andato a controllare e mi sono accorto di aver copincollato per sbaglio una vecchia versione che usavo quando gestivo più classi e più argomenti.

    La versione molto più semplice che uso ora, comunque lentissima con IE, è questa (con la miglioria nelle istruzioni alla classe spam suggeritami da te):

    codice:
    document.getElementsByClassName = function(clsName) {
        var retVal = new Array();
        var elements = document.getElementsByTagName('*');
        for (var i = 0 ; i < elements.length ; i++) {
            if (elements[i].className.indexOf(' ') >= 0) {
                var classes = elements[i].className.split(' ');
                for(var j = 0;j < classes.length;j++){
                    if(classes[j] == clsName)
                        retVal.push(elements[i]);
                }
            }
            else if (elements[i].className == clsName)
                retVal.push(elements[i]);
        }
        return retVal;
    }
    
    
    function gest_spam() {
    
        var b = document.getElementsByClassName('spam');
    
        for (i=0 ; i<b.length ; i++)  
           b[i].innerHTML = '';
    }
    
    
    function gest_emoticon() {
    
        var d = document.getElementsByClassName('smiley');
    
        for (i=0 ; i<d.length ; i++) { 
    
            d[i].innerHTML = d[i].innerHTML.replace(/:-?\)/g,  ' [img]URL_GIF_1[/img] ');
            d[i].innerHTML = d[i].innerHTML.replace(/:-?\(/g,  ' [img]URL_GIF_2[/img] ');
            .........
        }
    }
    
    
    function addLoadEvent(func) {
        var oldonload = window.onload;
    
        if (typeof window.onload != 'function')
             window.onload = func;
    
        else {
             window.onload = function() {
                if (oldonload)
                    oldonload();
    
                func();
             }
        }
    }
    addLoadEvent (gest_emoticon);
    addLoadEvent (gest_spam);
    dove, come avevo detto, il contenuto delle classi è la stringa contiene un singolo commento ad un post su Blogger. A questo punto direi proprio che la parte che funziona non troppo bene è quella riguardante la funzione getElementsByClass, che con IE non è implementata.

    Ora, riguardo tale funzione da usare con IE non sono riuscito a trovare codici molto recenti, quello meno datato che ho trovato è questo:
    http://robertnyman.com/2008/05/27/th...ame-anno-2008/

    Qualcuno sa se esistono alternative migliori, per favore?

  10. #10
    il mio ultimo post sul mio blog più il mio blog è su piattaforma blogger e mostra smiles da tempo (il primo a farlo) via jSmile, come ho già suggerito, e zero innerHTML
    Formaldehyde a new Ajax PHP Zero Config Error Debugger

    WebReflection @WebReflection

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.