Ajax neproběhne až do konce (verze 2)
- Saurian
- Člen | 28
Nevím si už rady, jsem naprostý začátečník a proto Vás prosím o radu. Mám následující kód, který však neproběhne do konce (bez Ajaxu vše funguje jak má)
@layout.phtml ...
<script type="text/javascript" src="{$basePath}/js/jquery.js"></script>
<script type="text/javascript" src="{$basePath}/js/jquery.nette.js"></script>
</head>
<body>
<div id="container">
{snippet}
@{include #content}
{/snippet}
</div>
</body>
default.phtml
@{block content}
<!--****************************************************************************************-->
<a href="{link insert!, 1}" class="ajax">
<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
</a>
<p>Náhodné číslo {$rndnum}</p>
Presenter ...
final class AuctionPresenter extends BasePresenter
{
/**
* Hodnota vhozených mincí.
* @persistent - proměnná se přenáší mezi HTTP požadavky
*/
public $pokus = 1;
public function handleInsert($num) {
$this->pokus = rand(1,118);
if (!$this->isAjax()) {
$this->redirect('this');
}
}
public function actionDefault()
{
}
public function renderDefault()
{
$this->template->rndnum= $this->pokus;
$this->invalidateControl();
}
}
jquery.nette.js
<script>
/**
* AJAX Nette Framwork plugin for jQuery
*
* @copyright Copyright (c) 2009 Jan Marek
* @license MIT
* @link https://componette.org/search/?q=jquery-ajax
* @version 0.1
*/
jQuery.extend({
updateSnippet: function(id, html) {
$("#" + id).html(html);
},
netteCallback: function(data) {
// redirect
if (data.redirect) {
window.location.href = data.redirect;
}
// snippets
if (data.snippets) {
for (var i in data.snippets) {
jQuery.updateSnippet(i, data.snippets[i]);
}
}
}
});
jQuery.ajaxSetup({
success: function (data) {
jQuery.netteCallback(data);
},
dataType: "json"
});
$(function() {
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) {
$.get(this.href);
// show spinner
$('<div id="ajax-spinner"></div>').css({
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
}).ajaxStop(function() {
$(this).remove();
}).appendTo("body");
return false;
});
});
</script>
V JavaScriptu proběhne jen událost
<script>
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) {
.
.
</script>
tím celí proces končí, nevím kde je zakopán čert (proč neproběhne
<script>
jQuery.ajaxSetup({
success: function (data) {
.
.
a vykreslení snipetu
jQuery.extend({
updateSnippet: function(id, html) {
.
.
</script>
Může mi někdo poradit ?
- Saurian
- Člen | 28
kdepak, jen ve FireBugu vidím, že proběhne pouze událost „$("a.ajax“).live(„click“, function(event) {"
(kliknutí myši), toď vše
pokud odstraním z odkazu class=„ajax“
<a href="{link insert!, 1}" class="ajax">
<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
</a>
funguje vše normálně (tj. zobrazí se náhodné číslo).
Potřeboval bych jen tohle rozchodit a pak se můžu odrazit dál, ale jsem „zakysnutý“ na tímto problémem už druhý den (to jsem zkusil všemožné příklady Ajaxu ze stránek, nebyl problém, jen u tohoto si už nevím rady)
- Saurian
- Člen | 28
Se zavináči i bez nich jsem to zkoušel mockrát, výsledek stejný …
Zajímavé je, že „nové“ náhodně číslo ve výsledku JSON je (ve FireBugu / síť / JSON / snippets / snippet) je pěkně nový zápis např.
<p>Náhodné číslo 15</p>
jen se to nechce zobrazit na stránkách (přitom proběhne i animace „spinner.gif“ zcela vpořádku), jen stále vidím
<p>Náhodné číslo 1</p>
- Mikulas Dite
- Člen | 756
Ola napsal(a):
Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}
A nezapomeň ten snippet invalidovat jménem:
$this->invalidateControl('content');
.
- Saurian
- Člen | 28
Já si taky myslím, že chyba by měla být právě tam (Java je zatím u mě spíše slabinou, tohle jsem jen okopíroval …)
jquery.nette.js
<script>
/**
* AJAX Nette Framwork plugin for jQuery
*
* @copyright Copyright (c) 2009 Jan Marek
* @license MIT
* @link https://componette.org/search/?q=jquery-ajax
* @version 0.1
*/
jQuery.extend({
updateSnippet: function(id, html) {
$("#" + id).html(html);
},
netteCallback: function(data) {
// redirect
if (data.redirect) {
window.location.href = data.redirect;
}
// snippets
if (data.snippets) {
for (var i in data.snippets) {
jQuery.updateSnippet(i, data.snippets[i]);
}
}
}
});
jQuery.ajaxSetup({
success: function (data) {
jQuery.netteCallback(data);
},
dataType: "json"
});
$(function() {
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) {
$.get(this.href);
// show spinner
$('<div id="ajax-spinner"></div>').css({
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
}).ajaxStop(function() {
$(this).remove();
}).appendTo("body");
return false;
});
});
</script>
mám nalinkovány jen tyhle 2
<script type=„text/javascript“ src=„{$basePath}/js/jquery.js“></script>
<script type=„text/javascript“ src=„{$basePath}/js/jquery.nette.js“></script>
jquery.js
by asi nebylo moudré vypisovat :)
- Saurian
- Člen | 28
Mikulas Dite napsal(a):
Ola napsal(a):
Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}
A nezapomeň ten snippet invalidovat jménem:
$this->invalidateControl('content');
.
Ano tohle jsem rovněž zkoušel,
$this->invalidateControl('content');
v renderDefault
i v signálu „handleInsert“, stále stejný výsledek.
<body>
<div id="container">
{snippet content}
{include #content}
{/snippet}
</div>
</body>
{block content}
<a href="{link insert!, 1}" class="ajax">
<img src="./images/coin-1.png" alt="Vhoď 1 Kč" />
</a>
<p>Náhodné číslo {$rndnum}</p>
public function handleInsert($num) {
$this->pokus = rand(1,118);
if (!$this->isAjax()) {
$this->redirect('this');
}
// $this->invalidateControl();
$this->invalidateControl('content');
// echo $this->isControlInvalid('content');
}
public function actionDefault()
{
}
public function renderDefault()
{
$this->template->rndnum = $this->pokus;
// $this->invalidateControl();
$this->invalidateControl('content');
}
- Ola
- Člen | 385
Mikulas Dite napsal(a):
Ola napsal(a):
Zkus ten snippet nějak pojmenovat, tj místo {snippet} dej např. {snippet content}
A nezapomeň ten snippet invalidovat jménem:
$this->invalidateControl('content');
.
To není třeba, při neuvedení toho parametru se zinvalidují všechny snippety na stránce
Zkusím se ještě mrknout na ten js, jestli mi něco neprobleskne
Tak mě napadá, používáš nějakou starou verzi toho pluginu, zkus ji aktualizovat. A ještě – máš správně nalinkovaný a umístěný soubor jquery.nette.js?
Editoval Ola (11. 4. 2010 20:41)
- Saurian
- Člen | 28
tak tak, $this->invalidateControl() by mělo stačit .
verze „jquery.nette.js“ je okopírovaná z příkladu „CoffeeVendingMachineV“, což je takový modifikovaný script jako nejnovější z těchto stránek + doplňěk o …
<script>
/* Volání AJAXu u všech odkazů s třídou ajax */
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
</script>
, samozřejmě jsem už zkoušel různé verze, ale nic nepomáhá, výsledek je vždy stejný
scripty mám uloženy v „document_root\js\“
tedy :
document_root\js\jquery.js
document_root\js\jquery.nette.js
nalinkováno by mělo být dobře, jinak bych neviděl že proběhla událost „click“ ve FireBugu
to je zapeklitá situace, jak rád bych se pohnul už dál …
- Ola
- Člen | 385
Zkus to trochu poupravit dle tohodle:
https://componette.org/search/?…
Pokud do metody updateSnippet přidáš např. alert('Ahoj');
,
provede se to?
Ještě mě napadlo, zkus změnit řádek
<script>
$.get(this.href);
</script>
na
<script>
$.get(this.href, {}, function(payload) {
if (payload.snippets) {
for (var i in data.snippets) {
$("#" + i).html(payload.snippets[i]);
}
}
});
</script>
Editoval Ola (11. 4. 2010 21:37)
- Saurian
- Člen | 28
Výborný nápad s tím alertem, díky …
bohužel jak jsem říkal už víše, proběhne jen část
<script>
/* Volání AJAXu u všech odkazů s třídou ajax */
$("a.ajax").live("click", function (event) {
event.preventDefault();
$.get(this.href);
});
</script>
updateSnippet už neproběhne (to jsem odhalil i z toho FireBugu)
- Saurian
- Člen | 28
<script>
$(function() {
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) {
$.get(this.href, {}, function(payload) {
alert('Ahoj'); // Alert byl přeskočen (krokováno)
if (payload.snippets) {
for (var i in data.snippets) {
$("#" + i).html(payload.snippets[i]);
}
}
});
// show spinner // Po Breakpointu to skočí sem ($.get(this.href, {}, function(payload) is false ?
$('<div id="ajax-spinner"></div>').css({
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
}).ajaxStop(function() {
$(this).remove();
}).appendTo("body");
return false;
});
});
</script>
bohužel nepomohlo, k alertu se to nedostalo, rovnou to skočilo na „show spinner“
- Ola
- Člen | 385
V tom případě ten jQuery nezavolá událost success.
Chyba je u tebe, viz. http://jquery.jslab.net/zkousecka/#… – zde se alert zobrazí
Editoval Ola (11. 4. 2010 22:04)
- Saurian
- Člen | 28
Ola napsal(a):
Chyba je u tebe, viz. http://jquery.jslab.net/zkousecka/#… – zde se alert zobrazí
tedy klobouk dolů, pěkný nástroj, jsem rád že jsem se odvážil sem napsat na forum, člověk se docela přiučí za krátkou dobu, moc díky, opravdu pěkný nástroj …
- Saurian
- Člen | 28
Ola napsal(a):
Zkus to celý zabalit a někam uploadnout, podíval bych se na to pořádně.
Perfektní
Editoval Saurian (11. 4. 2010 22:39)
- Ola
- Člen | 385
Sorry, v tom kódu co sem poslal já byla chyba, změň si tam data na payload v tom for cyklu a pojede to
A pokud změnim ten kód co sem posílal zpět na $.get(this.href); tak to taky jede
// ale abych to vůbec rozjel tak sem musel smazat poslední řádek v configu
Editoval Ola (12. 4. 2010 6:59)
- Saurian
- Člen | 28
ajaj, tak to bude chyba někde u mě, že by Apache ? Zkusím najít nějaký hosting a vyzkoušet to tam.
<script>
$(function() {
// apply AJAX unobtrusive way
$("a.ajax").live("click", function(event) { // u mě se script dostane sem
$.get(this.href, {}, function(payload) { // ...
alert('Ahoj'); // ...
if (payload.snippets) { // ...
for (var i in payload.snippets) { // ...
$("#" + i).html(payload.snippets[i]); // .tyto řádky už neběží
} // ...
} // ...
});
// show spinner
$('<div id="ajax-spinner"></div>').css({ // a pak hned skočí sem
position: "absolute",
left: event.pageX + 20,
top: event.pageY + 40
}).ajaxStop(function() {
$(this).remove(); // po skončení animace ? skočí sem
}).appendTo("body"); // vykreslí se animace
return false; // zavolá se false
// (neobnovení prohlížeče ?
});
});
</script>
- Saurian
- Člen | 28
**Vyřešeno hurá** , ale řeknu Vám zapotil jsem se jak už dlouho ne ...
Nejdříve jsem velmi detailně prostudoval project „Kniha návštěv v Ajaxu“ (autor myslím Panda, kterému se zároveň omlouvám, že jsem jeho dílo rozebral doslova na šroubky :), velice pěkný materiál a nováčkům vřele doporučuji).
- Celou dobu mě bylo divné, proč project „Kniha návštěv“ funguje a můj ne, když klíčové věci jsou stejné, („Knihu návštěv“ jsem upravil podle mého „projectu“, tedy jen odkaz s náhodným číslem).
- Jediný rozdíl byl v tom, že „můj project“ byl v presenteru Auction, „kniha návštěv“ Homepage , maturoval jsem už i s atributy souborů atd. atd. (samozřejmě šablony, scripty … jsou shodné)
- Kódování souborů „AuctionPresenter“ a „HomepagePresenter“ je samozřejmě UTF8, ale pak mě napadla jedna věc, podívat se na soubor v NetBeansu a ejhle
- Na začátku souboru se zobrazil paskvil
<?php
Tohle nebylo vidět v žádném jiném prohlížeči a i délka souborů „AuctionPresenter“ a „HomepagePresenter“ byla stejná. (po opravě samozřejmě vše funguje jak má…)
Takže doporučení pro ostatní, kdo děláte v programu PHPEdit v3.4.2.930 (kde jsem vytvářel soubor „AuctionPresenter“), nedoporučuji v něm vytvářet nové soubory/adresáře, už dřív jsem pozoroval „divné“ chování v Nettu (při vytvoření nového souboru, ale nevěnoval jsem tomu tolik pozornosti, dělám v Nette Frameworku teprve týden.
Tak asi tak … :)
A ještě jednou díky Olaovi za trpělivost (s takovým problémem jsem se
dlouho nesetkal .)
Editoval Saurian (13. 4. 2010 1:48)
- Saurian
- Člen | 28
Mortaelth napsal(a):
Saurian napsal(a):
**Vyřešeno hurá** , ale řeknu Vám zapotil jsem se jak už dlouho ne ...
…viz bom, melo by to jit vypnout v editoru
ano máš pravdu, „nastavení souborů / výchozí kódování pro nové soubory / UTF8 wihout Byte Order Mark“
a kvůli tomuhle se člověk tak zbytečně natrápí … , no zase vím o něco víc, tak jdeme dál do práce :) , díky …