Je charge une autre page dans un el via XHR. La page chargée contient js qui génère une erreur et échoue à moins que l'élément dom requis ne soit chargé sur la page. Comme c'est XHR .ready et. Al. ne fonctionnera pas.

Je l'ai avec un délai d'attente de 500 ms, mais ce n'est pas OK; Il doit y avoir une meilleure façon. Avec le timeout, le dom el ne se charge pas toujours et la page échoue.

Il y a un tableau codé en dur sur la page avec un id. Le script de la page est un plugin jquery (tables de données) et ne s'initiera que si la table est chargée.

J'ai pensé à avoir une fonction qui contient les éléments des tables de données et à appeler à plusieurs reprises while $('#tableID') est null mais je ne suis pas sûr que ce soit correct.

<div id="contactQueue">
<table cellpadding="0" cellspacing="0" border="0" class="display" id="contactsQueueTable">
    <thead>
        <tr>
            <th class="" rowspan="1" colspan="1" style="width: 185px; ">Contact Name</th>
            <th class="" rowspan="1" colspan="1" style="width: 148px; ">Bus. Name</th>
            <th class="" rowspan="1" colspan="1" style="width: 116px; ">Is Client</th>
            <th class="" rowspan="1" colspan="1" style="width: 165px; ">Remove</th>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>
</div>
<?php echo form_open('',array('id'=>'step2form','name'=>'step2form'));?>
<input type="hidden" name="clientID" value="<?php echo $clientID; ?>">
<?php echo form_close();?>


<script type="text/javascript" charset="utf-8">
console.log(jq('#currentContactsTable'))
while(jq('#currentContactsTable').html()==null){
    initXHRPage();
    console.log(jq('#currentContactsTable')+' not ready');
}
function initXHRPage(){
    //init tables stuffs
}

ÉDITER;

Le problème était autre chose, un peu. Le script des tables de données est en cours de chargement via getScript(). L'élément était chargé normalement, mais initDatatables() se tirait avant le chargement de getScript() , pas avant le chargement de l'el.

La solution était d'appeler la fonction initDatatables() dans le rappel de succès getScript():

<script type="text/javascript" charset="utf-8">
var jsf = '/js/jquery.dataTables.js';
jq.getScript(jsf, function(data, textStatus){
    console.log('Loaded:'+jsf+" From: <?php echo $this->uri->uri_string(); ?>");
    initDatatable();
});
</script>
0
stormdrain 11 oct. 2011 à 21:15

3 réponses

Meilleure réponse

C'est ce que j'ai trouvé. Merci aux répondants pour obtenir de l'aide.

initPage();

function initPage(){
    if(jq('#currentContactsTable').length==1){
            initDatatable();
    }else{
            window.setTimeout(function(){
                    initPage();
            },250);
    }
}

function initDatatable(){
    jq('#currentContactsTable').dataTable( {
            //REST OF DATATABLE STUFF...

Ce n'est peut-être pas super joli car il repose toujours sur un timeout, mais au moins cette timeout c'est un peu plus robuste ...


^^^^ BZZZZZZZZZZ

Le problème était autre chose, un peu. Le script pour les tables de données est en cours de chargement via getScript (). L'élément était chargé normalement, mais initDatatables () était lancé avant le chargement de getScript (), pas avant le chargement de el.

La solution était d'appeler la fonction initDatatables () dans le rappel de succès getScript ():

<script type="text/javascript" charset="utf-8">
var jsf = '/js/jquery.dataTables.js';
jq.getScript(jsf, function(data, textStatus){
    console.log('Loaded:'+jsf+" From: <?php echo $this->uri->uri_string(); ?>");
    initDatatable();
});
</script>
0
stormdrain 13 oct. 2011 à 13:58

Comment je comprends que votre html / js se charge:

  • containerPage -> $ .get (/ajax/getMiddlePage.php)
  • page XHR du milieu -> $ .get (/ajax/getContactQueue.php)
  • page XHR du milieu -> $ .get (/ajax/getCurrentContactsTable.php)

Rugueux. ok, voici ce dont je pense que vous avez besoin:

<html>
<!---CONTAINER PAGE--->
<head>
    <script type="text/javascript">
    //this .ready is to register events we need to catch the '#currentContactsTable' load event
    $(document).ready(function(){
    //ajaxSuccess is a global ajax function, you need to check ajaxOptions object to ensure you have the correct 'ajaxSuccess' you thought you did.
      $.ajaxSuccess(function(event, XMLHttpRequest, ajaxOptions){
        if (ajaxOptions.url == '/ajax/getCurrentContactsTable.php') {
          $('#currentContactsTable').trigger('initDataTables');
        }
      });
// .live() does not need the element to exist on document.ready()
      $('#currentContactsTable').live('initDataTables', function(event){
          var dataTables = $(this).datatables({options:here});
      });
    });
    </script>
</head>
<body></body>
</html>
1
DefyGravity 11 oct. 2011 à 19:04

Avez-vous essayé $(el).ready(...)? Cela devrait certainement fonctionner. Si ce n'est pas le cas, quelque chose d'autre ne va pas.


Éditer

Désolé, cela aurait dû être $("#your_xhr_loaded_content").ready()....

Je fais ce genre de choses tout le temps et ça marche, je pense que la clé est que je suis en train de charger un document.

Document HTML principal, index.html:

    ...
    <body>
        ...
        <div id="activity_content">
        </div>
        ...
        <script type="text/javascript" src="js/jquery-1.6.4.min.js"></script>
        <script type="text/javascript" src="js/main.js"></script>
    </body>
</html>

main.js:

...

function ruleManagement.loadContent() {
    $.ajax({
        url: "subdocs/ruleMgmt.html",
            cache: false,
            success: function(html) {
                $("#activity_content").html(html);
            }
    }
}

ruleManagement.onReady = function(event) {
    // Init contents of the rule_management_pane
    ...
}

Sous-document HTML, ruleMgmt.html

<div id="rule_management_pane">
    <!-- Content here -->
    ...
</div>
<script type="text/javascript" language="JavaScript">
    jQuery("#rule_management_pane").ready(ruleManagement.onReady);
</script>

Si j'appelle ruleManagement.loadContent(), ruleManagement.onReady() est appelé une fois que div # rule_management_pane a été chargé avec succès. Je ne peux pas dire avec certitude que onReady est invoqué avant que div # rule_management_pane soit inséré dans #activity_content, mais je pense que c'est le cas.

2
dgvid 12 oct. 2011 à 14:43
7729863