Kan geen js-function oproepen uit php-js file

Pagina: 1

Acties:
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Hallo,

Ik heb een vaag probleem. Ik heb 2 bestanden, beide js.
filenaam1.js
filenaam2.php
De PHP-file headers heb ik zo gedaan dat 'ie t ziet als javacript.
Nu zit er in de php-file een function, die ik in datzelfde bestand kan aanroepen. Maar ik kan die functie niet oproepen vanuit filenaam1.js...
Inhoud van de bestanden die handig is:
filenaam1.js
JavaScript:
1
2
3
4
$('#init').click(function() {
/*blashit*/
init();
});

filenaam2.php
JavaScript:
1
2
3
4
5
<?php session_start(); header('Content-type: application/x-javascript'); ?>
$(document).ready(init(););
function init() {
/*blablabla*/
}

En ja, eerst wordt de PHP geladen, dat was mijn eerste gedachten. Als ik een functie uit een andere .js oproep vanuit filenaam1.js werkt dat WEL.
Firebug ziet filenaam2.php niet tussen de scripts...

Ik snap t niet meer?

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 11.794
Reg. datum: 12-11-2000

PHP is serverside. Dat moet door een parser heen. Je kan geen PHP code sturen naar de client, en verwachten dat die de PHP gaat uitvoeren.

Je zal het javascript gedeelte dus wel met PHP moeten echo'en naar de client.

Edit: En toen keek ik totaal om die ?> heen op regel 1. My bad.

RaZ wijzigde deze reactie 28-04-2012 23:18 (13%)

Verboden onder de streep te schrijven

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Nee, ik heb de file .php genoemd, juist om 'm serverside te laten parsen. Dan komt er in de browser een werkend resultaat uit, zonder de php tags, maar met wat er moest worden geëcho'd. Alleen ik kan daar geen functie in oproepen.
(zo werkt mijn css ook, een .php file die ik php laat parsen en dan css-output. Zie wiethoofd's custom headerkleurtjes, doet dat ook)

edit:
ok :P

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 1.254
Reg. datum: 08-08-2005

Klik vanuit de broncode (view source) eens de script src aan? Dan moet je de javascript code zien. Als je met firebug filenaam2.php niet ziet, moet er iets mis zijn met de referentie in je html.

SWIS - Strategie. Creatie. Development.

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Daar zie ik alles, ook de goede geparste js. In firebug herkent 'ie het script wel, maar niet als script in het tabblad scripts. Ik kan hem bij tab HTML wel uitklappen en dan zie ik scriptweergave... Heel vaag

Oja:
Alles werkt gewoon zoals het hoort, behalve dat aanroepen... (ook vanuit index.php zelf)

F.West98 wijzigde deze reactie 28-04-2012 23:27 (18%)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

raven op je pantoffels
Reacties: 1.022
Reg. datum: 09-06-2005

Je code is toch ook fout?

In plaats van
code:
1
2
3
4
$(document).ready(init();); 
function init() { 
/*blablabla*/ 
}

moet je
code:
1
2
3
4
$(document).ready(init); 
function init() { 
/*blablabla*/ 
}

doen. Als ik jouw code run op jsFiddle werkt ie niet, de tweede manier werkt wel.

Like brothers on a hotel bed

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
Struikrover schreef op zaterdag 28 april 2012 @ 23:28:
Je code is toch ook fout?

In plaats van
code:
1
2
3
4
$(document).ready(init();); 
function init() { 
/*blablabla*/ 
}

moet je
code:
1
2
3
4
$(document).ready(init); 
function init() { 
/*blablabla*/ 
}

doen. Als ik jouw code run op jsFiddle werkt ie niet, de tweede manier werkt wel.
Nee hoor, de init werkt bij ready wel. Maar als ik hem daarna oproep vanuit extern file werkt ie niet...
Daar gaat ie ook niet fout

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 850
Reg. datum: 19-03-2009

quote:
F.West98 schreef op zaterdag 28 april 2012 @ 23:29:
[...]

Nee hoor, de init werkt bij ready wel. Maar als ik hem daarna oproep vanuit extern file werkt ie niet...
Daar gaat ie ook niet fout
Jij voert de functie meteen uit i.p.v. deze mee te geven aan de ready callback, die ervoor bedoeld is om code pas uit te voeren wanneer het veilig is om de DOM tree v/d pagina te manipuleren. Dat het in jouw huidige geval werkt is slechts een gelukstreffer; de DOM tree is toevallig al gereed op het moment dat jouw script file klaar is met laden en kan gaan draaien.

Dat hoeft echter (zeker met caching) niet het geval te zijn en als het dan verkeerd gaat kun je gelijk tegen lelijke issues aan lopen. Zo laten IE8 en lager bijvoorbeeld bij bepaalde manipulaties op een incomplete DOM tree een error dialog 'Operation aborted' zien en presenteren ze vervolgens alleen nog een placeholder pagina met een nietszeggende 'friendly error'.
raven op je pantoffels
Reacties: 1.022
Reg. datum: 09-06-2005

Probeer het eens op een hele simpele manier. Ik krijg het namelijk wel voor elkaar als ik deze code gebruik:

dynjs.php:
code:
1
2
3
4
<?php session_start(); header('Content-type: application/x-javascript'); ?> 
function init() { 
 alert("hoi"); 
}

html file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<head>
<title>test</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript" src="dynjs.php"></script>
<script type="text/javascript">
    $(document).ready(init);
</script>
</head>
<body>
Hoi
</body>

</html>

Like brothers on a hotel bed

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
R4gnax schreef op zaterdag 28 april 2012 @ 23:37:
[...]


Jij voert de functie meteen uit i.p.v. deze mee te geven aan de ready callback, die ervoor bedoeld is om code pas uit te voeren wanneer het veilig is om de DOM tree v/d pagina te manipuleren. Dat het in jouw huidige geval werkt is slechts een gelukstreffer; de DOM tree is toevallig al gereed op het moment dat jouw script file klaar is met laden en kan gaan draaien.

Dat hoeft echter (zeker met caching) niet het geval te zijn en als het dan verkeerd gaat kun je gelijk tegen lelijke issues aan lopen. Zo laten IE8 en lager bijvoorbeeld bij bepaalde manipulaties op een incomplete DOM tree een error dialog 'Operation aborted' zien en presenteren ze vervolgens alleen nog een placeholder pagina met een nietszeggende 'friendly error'.
De code staat wel onderaan de body, dus dat kan het zijn. Is dan zonder de (); de goede manier? Dan zal ik dat doen
quote:
Struikrover schreef op zaterdag 28 april 2012 @ 23:38:
Probeer het eens op een hele simpele manier. Ik krijg het namelijk wel voor elkaar als ik deze code gebruik:

dynjs.php:
code:
1
2
3
4
<?php session_start(); header('Content-type: application/x-javascript'); ?> 
function init() { 
 alert("hoi"); 
}

html file:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<html>

<head>
<title>test</title>
<script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
<script type="text/javascript" src="dynjs.php"></script>
<script type="text/javascript">
    $(document).ready(init);
</script>
</head>
<body>
Hoi
</body>

</html>

Helaas is het ready init niet het probleem, maar een losse call van init werkt niet.
DUS DE INIT IN FILENAAM1.JS GAAT FOUT. Niet die in filenaam2.php

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

raven op je pantoffels
Reacties: 1.022
Reg. datum: 09-06-2005

Wat je in filenaam1.js doet, is een event handler registreren op een object dat op dat moment wellicht nog niet bestaat. Je moet het registreren van deze handler dus ook achter een $(document).ready() zetten.

Is dit nu wat je wilt?

script.js:
JavaScript:
1
2
3
4
$(document).ready(function()
{
    $('#knop').click(init);
});

dynjs.php:
JavaScript:
1
2
3
4
<?php session_start(); header('Content-type: application/x-javascript'); ?> 
function init() { 
    alert("kiekeboe");
}

html:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>

<head>
    <title> test </title>
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="dynjs.php"></script>
    <script type="text/javascript" src="script.js"></script>
</head>

<body>
<input type="button" id="knop" value="klik" />
</body>

</html>

Like brothers on a hotel bed

Reacties: 14.590
Reg. datum: 24-04-2000

Je moet dus gewoon debuggen, prak de code uit je php file eens in een statische .js file en kijk wat ie dan doet. Als ie het dan ook niet doet kun je uitsluiten dat het aan php ligt. Pak Firebug erbij (of IE/Chrome devtools) en kijk wat de error is.
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
Struikrover schreef op zondag 29 april 2012 @ 00:02:
Wat je in filenaam1.js doet, is een event handler registreren op een object dat op dat moment wellicht nog niet bestaat. Je moet het registreren van deze handler dus ook achter een $(document).ready() zetten.

Is dit nu wat je wilt?

script.js:
JavaScript:
1
2
3
4
$(document).ready(function()
{
    $('#knop').click(init);
});

dynjs.php:
JavaScript:
1
2
3
4
<?php session_start(); header('Content-type: application/x-javascript'); ?> 
function init() { 
    alert("kiekeboe");
}

html:
HTML:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
<html>

<head>
    <title> test </title>
    <script type="text/javascript" src="http://code.jquery.com/jquery.min.js"></script>
    <script type="text/javascript" src="dynjs.php"></script>
    <script type="text/javascript" src="script.js"></script>
</head>

<body>
<input type="button" id="knop" value="klik" />
</body>

</html>

Dat wil ik, maar de functie werkt verder wel - de rest van de functie is 100 regels, samen met de externe functie. Dus de .click bevat nog veeeel meer code die wel werkt.
quote:
Cartman! schreef op zondag 29 april 2012 @ 12:11:
Je moet dus gewoon debuggen, prak de code uit je php file eens in een statische .js file en kijk wat ie dan doet. Als ie het dan ook niet doet kun je uitsluiten dat het aan php ligt. Pak Firebug erbij (of IE/Chrome devtools) en kijk wat de error is.
In een statische js file krijg ik vage errors omdat er dingen missen, zet ik die erin werkt het gewoon WEL
Firebug geeft error dat init(); niet bestaat, terwijl dat wel zo is omdat ie ergens anders wel kan worden aangeroepen.
Firebug herkent de .php dus niet als js

edit:
als .js met de php als comments doet hij NIETS meer en nog steeds herkent firebug m niet
edit2:
geconverteerd naar UTF-8 zonder BOM werkt de .php als .js wel
edit3:
werkend op UTF-8 zonder BOM.......
edit4:
oproepen werkt nog niet - function wordt niet uitgevoerd - rest van de aanroepfunction wel

F.West98 wijzigde deze reactie 29-04-2012 17:01 (6%)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 14.590
Reg. datum: 24-04-2000

quote:
F.West98 schreef op zondag 29 april 2012 @ 16:44:
[...]
In een statische js file krijg ik vage errors omdat er dingen missen, zet ik die erin werkt het gewoon WEL
Hoe kunnen die nu missen als je de output van de .php file gewoon opslaat?
quote:
Firebug geeft error dat init(); niet bestaat, terwijl dat wel zo is omdat ie ergens anders wel kan worden aangeroepen.
Blijkbaar zit je dan met een volgorde danwel scope probleem.
quote:
Firebug herkent de .php dus niet als js

edit:
als .js met de php als comments doet hij NIETS meer en nog steeds herkent firebug m niet
als comments? laat eens een voorbeeld zien? volgens mij klooi je maar gewoon iets aan.
quote:
edit2:
geconverteerd naar UTF-8 zonder BOM werkt de .php als .js wel
edit3:
werkend op UTF-8 zonder BOM.......
edit4:
oproepen werkt nog niet - function wordt niet uitgevoerd - rest van de aanroepfunction wel
Zoals ik zei, waarschijnlijk een volgorde of scope probleem.
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
Cartman! schreef op maandag 30 april 2012 @ 09:55:
[...]

Hoe kunnen die nu missen als je de output van de .php file gewoon opslaat?
Ik had de .php naar .js gedaan, en toen de php-delen ge-comment en dan vergeten gewone results er voor in de plaats te zetten -_-
quote:
Zoals ik zei, waarschijnlijk een volgorde of scope probleem.
Dat weet ik heel zeker van niet. Want de volgorde van de scripts is goed. Eerst de .php met de function, daarna pas de .js die die function oproept. Praktijkvoorbeeld staat lokaal, om mijn IP hier nu te gaan posten... (en het werkt enkel na inlog)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

raven op je pantoffels
Reacties: 1.022
Reg. datum: 09-06-2005

Als je nu gewoon een uitgeklede of gecensureerde versie van je probleem maakt en die hier neer zet in plaats van eigenwijs te zijn en bij al onze hulp te zeggen dat daar het probleem niet ligt...
Dan kunnen we je helpen, en misschien lost het zich bij het opnieuw maken ook wel zelf op.

Like brothers on a hotel bed

Reacties: 2.393
Reg. datum: 28-03-2008

quote:
F.West98 schreef op maandag 30 april 2012 @ 16:04:
[...]

Dat weet ik heel zeker van niet. Want de volgorde van de scripts is goed. Eerst de .php met de function, daarna pas de .js die die function oproept. Praktijkvoorbeeld staat lokaal, om mijn IP hier nu te gaan posten... (en het werkt enkel na inlog)
Wat nou als je een uitgeklede test case op http://jsfiddle.net/ zet?
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

http://jsfiddle.net/3qqxs/5/
Mijn testcase. Zou moeten werken maar werkt niet. De inhoud van test.php:
JavaScript:
1
2
3
4
5
6
7
8
9
<?php header('Content-type: application/x-javascript'); ?>

function init() {
 $('body').addClass('js');
 $('.edit').click(function() {
    alert('clicked edit');
 }
}
$(document).ready(init);

test.js:
JavaScript:
1
2
3
4
5
6
function animate(data) {
    var wrap = $('.wrap');
    $(wrap).empty()
    $(wrap).append(data);
    init();
}

In de testcase gaat alles met function init fout

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 2.393
Reg. datum: 28-03-2008

Als ik alles letterlijk overneem krijg ik toch echt een error in mijn Firebug console, namelijk: 'missing ) after argument list' in jouw test.php. Je bent vergeten je $('.edit').click functie af te sluiten.

Lees ook eens Programming FAQ - Algemeen - Tips bij debuggen door
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Die heb ik inmiddels al 10x doorgenomen.
De fout die erin zat was een snelheidfoutje, maar... In de echte versie zit die fout niet. Ik heb alles nog 10x doorgenomen, nee daar zit geen fout in...

aha... hij geeft inmiddels geen init fout meer, maar alles in init wordt simpelweg niet gerund... :P
edit:
de init zoals ik die nu run: opnieuw initialiseren (alle elementen in de DOM) hoeft niet, als ik de init in animate() weghaal werkt het nog steeds. is er toch iets anders...

update:
als ik handmatig init run werkt hij, hij wordt simpelweg niet opgeroepen (gaat de .js nog eens controleren)
de .js moet helemaal goed zijn, jslint geeft ook geen errors (behalve een var die opnieuw wordt geset, haal ik het weg is het out of scope, ja, zo kan ik ook wel wat onzin maken)

F.West98 wijzigde deze reactie 30-04-2012 22:12 (66%)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 14.590
Reg. datum: 24-04-2000

Je jsfiddle doet niks omdat de 2 files op je IP timeouten. Zet ergens een losse testcase neer die gewoon alleen werkt met statische files zoals ik eerder al zei. Niet renamen ofzo maar gewoon view-source op je .php file doen en die opslaan als .js. Je lijkt onze adviezen momenteel een beetje te negeren.
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
Cartman! schreef op dinsdag 01 mei 2012 @ 11:55:
Je jsfiddle doet niks omdat de 2 files op je IP timeouten. Zet ergens een losse testcase neer die gewoon alleen werkt met statische files zoals ik eerder al zei. Niet renamen ofzo maar gewoon view-source op je .php file doen en die opslaan als .js. Je lijkt onze adviezen momenteel een beetje te negeren.
Het werkt dus wel met 2x een .js, dat is het probleem...
verder timeoutte hij omdat mijn server tijdelijk uitstond, nu weer aan...

Nieuwe link:
http://jsfiddle.net/3qqxs/11/
2x js:
http://jsfiddle.net/3qqxs/10/

Geen van beide runnen de init(); in de animate, maar ze staan er wel maar firebug geeft ze niet weer

F.West98 wijzigde deze reactie 01-05-2012 20:34 (14%)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Voor anderen die misschien ook tegen dit probleem aanlopen:
Het is opgelost d.m.v. het gebruiken van de jQuery functie .live(handler, action) i.p.v. .click()

Even hier neergezet aangezien het mij een veelvoorkomend probleem lijkt....

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 850
Reg. datum: 19-03-2009

quote:
F.West98 schreef op vrijdag 18 mei 2012 @ 21:24:
Voor anderen die misschien ook tegen dit probleem aanlopen:
Het is opgelost d.m.v. het gebruiken van de jQuery functie .live(handler, action) i.p.v. .click()

Even hier neergezet aangezien het mij een veelvoorkomend probleem lijkt....
Slecht advies. jQuery's live functie is al sinds 1.4.x deprecated. Die hoor je helemaal niet meer te gebruiken. In plaats daarvan hoor je de delegate functie te gebruiken of vanaf versie 1.7 de on functie.

(Overigens gaan er ook plannen rond om alle shorthand event binders zoals de click functie te verwijderen uit jQuery core en enkel nog als plugin beschikbaar te stellen, dus deze gebruiken is ook niet slim.)

R4gnax wijzigde deze reactie 19-05-2012 18:42 (14%)

Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

quote:
R4gnax schreef op zaterdag 19 mei 2012 @ 18:40:
[...]


Slecht advies. jQuery's live functie is al sinds 1.4.x deprecated. Die hoor je helemaal niet meer te gebruiken. In plaats daarvan hoor je de delegate functie te gebruiken of vanaf versie 1.7 de on functie.

(Overigens gaan er ook plannen rond om alle shorthand event binders zoals de click functie te verwijderen uit jQuery core en enkel nog als plugin beschikbaar te stellen, dus deze gebruiken is ook niet slim.)
Inderdaad, die blijkt beter. (de on)
edit:


Toch niet... Hij werkt niet :P

F.West98 wijzigde deze reactie 19-05-2012 19:36 (4%)

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Reacties: 616
Reg. datum: 12-06-2003

live() is wel deprecated, maar het verwijst gewoon naar de on functie. Dus qua werking zou het niet uit mogen maken. Mits je hem natuurlijk wel goed aanroept, zoals beschreven staat:

$("a.offsite").live("click", function(){ alert("Goodbye!"); }); // jQuery 1.3+
$(document).on("click", "a.offsite", function(){ alert("Goodbye!"); }); // jQuery 1.7+
Jongste 4 jaar-actieve user
Reacties: 4.836
Reg. datum: 19-06-2009

Gevonden... Op één of andere manier laadde ik jQuery 1.6.x in -_-
In ieder geval werkt het nu

Dell U2711 *O* | Intel Core i7 2600K | 8GB RAM | Samsung Spinpoint 2TB | EVGA P67 FTW | Club3D HD6790 | Samsung 830 256GB - Alles

Pagina: 1




© 1998 - 2013 Tweakers.net B.V. Contact Over Tweakers Jouw privacy Algemene voorwaarden Cookies

Tweakers wordt uitgegeven door De Persgroep en wordt gehost door True

Website van het jaar 2012