Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[Mootools] Json en evalScripts in 1 keer

Pagina: 1
Acties:

  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 28-11 01:05
Ik gebruik voor een online spel gemaakt in Mootools de Json functie om data over te pompen naar de clients. Echter, soms wil ik scripts meesturen die getriggerd worden. Dit kan met de Ajax class redelijk simpel door gewoon evalScripts: true op te nemen in je class. Echter werkt dit niet bij de Json class.

Wie weet hoe ik dit wel werkende kan krijgen? Ik denk na vrij veel gelezen te hebbne op de site van mootools dat het met extend moet maar dan werkt het ook niet.

Hier mijn code:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
function sendForm(url, updatediv, formid) {
  $(updatediv).empty().addClass('ajax-loading');
    var options = {};
    $(formid).getFormElements().each(function(el){
        var name = el.name;
        var value = el.getValue();
        if (value === true  || name || el.enabled) {
            options[name] = value;
        }
    });
    new Json.Remote(url, {
      evalScripts: true,
        onComplete: function(jsonObj){
            if (jsonObj.redirect) {
                window.location=jsonObj.redirect;
            };
            if (jsonObj.html){
              $(updatediv).removeClass('ajax-loading');
                $(updatediv).setHTML(jsonObj.html);
                return false;
            };
        },
        onFailure: function(){
            alert('Something went wrong');
        }
    }).send(options);
};


Volgens mij kan de Json class het gewoon nie en moet ik m nog extenden maar dat krijg ik niet aan de praat...

There is no replacement for displacement!


  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

Ik zou gewoon een onComplete meegeven aan Json.Remote() en een complete function() meepaasen?

jsonObj.function() en klaar?

dus je response gaat er dan zo uitzien:

JavaScript:
1
2
3
4
{
     blaat: [1,2,4,6],
     mekker: function() { alert('woei!'); }
}


in je onComplete:
JavaScript:
1
jsonObj.mekker();

Stop uploading passwords to Github!


  • JKVA
  • Registratie: Januari 2004
  • Niet online

JKVA

Design-by-buzzword fanatic

SchizoDuckie schreef op donderdag 01 november 2007 @ 09:36:
Ik zou gewoon een onComplete meegeven aan Json.Remote() en een complete function() meepaasen?

jsonObj.function() en klaar?

dus je response gaat er dan zo uitzien:

JavaScript:
1
2
3
4
{
     blaat: [1,2,4,6],
     mekker: function() { alert('woei!'); }
}


in je onComplete:
JavaScript:
1
jsonObj.mekker();
Een function wordt volgens mij niet door JSON ondersteund. Weet je zeker dat het werkt?

Fat Pizza's pizza, they are big and they are cheezy


Verwijderd

json "ondersteunt" sowieso niks, het is gewoon een js subset en daar zitten functies inderdaad niet in

Maar dat neemt niet weg dat je het wel gewoon over je lijntje kan sturen

  • SchizoDuckie
  • Registratie: April 2001
  • Laatst online: 18-02 23:12

SchizoDuckie

Kwaak

index.php:
PHP:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<? 
if(!empty($_GET))
{
    die('{ test: function() { alert("woei"); } }');
}
?>
<html>
<head>
    <script src='mootools.js'></script>
</head>
<body>
    <input type='button' onclick='new Json.Remote("index.php?go", {onComplete: function (response) { response.test(); } }).send();' value='clickme'>
</body>
</html>


werkt als een tiet hiero :)

edit:
Net even via de IM een discussie gehad met Clay:

Dit is inderdaad niet volgens de JSON specs, maar het werkt wel.
Wat je hier doet is eigenlijk een JS Object Literal aanmaken. Maakt in principe helemaal niet uit want qua syntax komen ze overeen met JSON en de JSON 'parse' functionaliteit van MooTools doet niets anders dan een eval() over de input string :)

[ Voor 38% gewijzigd door SchizoDuckie op 01-11-2007 15:13 ]

Stop uploading passwords to Github!


  • _eXistenZ_
  • Registratie: Februari 2004
  • Laatst online: 28-11 01:05
Ik loop stage bij een webdesignbedrijf, en inmiddels werd mij deze oplossing aangereikt:

Stuur naast jsonObj['html'] ook een jsonObj['scripts'] mee als je dit nodig heb, en zet deze via DHTML / Mootools in de head. Op deze manier wordt deze ook getriggerd. Dus met een externe javascript file waarvan je de url meegeeft in jsonObj['scripts'].

Veel mooiere oplossing imho :)

Bedankt voor jullie inzet en oplossing iig :)

/edit

Zo dus:

JavaScript:
1
2
3
4
5
6
7
8
9
10
11
12
13
if (jsonObj.scripts) {
  jsonObj.scripts.forEach(function(theScript) {
    if (typeof $('js_'+theScript.id) == 'undefined')
      var script = new Element('script');
      script.setProperties({
        'id': 'js_'+theScript.id,  
        'type': 'text/javascript',
        'src': theScript.src
      });
      script.injectInside(document.head);
    }
  }
}


Geen idee offie al werkt maar dit is iig het idee :)

[ Voor 41% gewijzigd door _eXistenZ_ op 01-11-2007 15:34 ]

There is no replacement for displacement!

Pagina: 1