简体   繁体   中英

Use a javascript function in a generated html code

I'm programming a simple html form with generated code from javascript. When i run the code in HTML itself it works, but when i put the script in a separate file, it doesn't work anymore. I tried to change the onclick event, generate the code in html, giving my elements a class and add a eventlistner to that, but nothing worked.

this is a part of my javascript code

    function print(){
        for (var j =0;j<3;j++){
            document.getElementById(idlist[j]).getElementsByTagName("UL")[0].innerHTML="";
            for (var i = 0; i<omschList.length;i++){
                var li = document.createElement("LI");
                if (j==0){
                    li.innerHTML = (idlist[j+3][i]+"<object align=\"right\" onclick=\"verwijder("+i+")\"><u>verwijder</u></object>");
                } else {
                    li.innerHTML = (idlist[j+3][i]);
                }
                document.getElementById(idlist[j]).getElementsByTagName("UL")[0].appendChild(li);
            }
        }
    }
     function verwijder(index){
        for (var i=0;i<3;i++){
            idlist[i+3].splice(index, 1);
        }
        print();
    }

EDIT the full javascript code

    (function ($) {

$( document ).ready( function() {

    /* VIEWPORT FIXES (http://timkadlec.com/2013/01/windows-phone-8-and-device-width/) */
    if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
      var msViewportStyle = document.createElement('style');
      msViewportStyle.appendChild(
        document.createTextNode(
          '@-ms-viewport{width:auto!important}'
        )
      );
      document.querySelector('head').appendChild(msViewportStyle);
    }


    document.getElementById("factuurFormSend").onclick = addLine;
      var omschList=[];
      var uurprList=[];
      var aantalList=[];
      var idlist=["omschrijving",
                  "uurprijs",
                  "aantal",
                  omschList,
                  uurprList,
                  aantalList]
    function addLine(){
        omschList.push(document.getElementById("formOmschrijving").value);
        uurprList.push(document.getElementById("formUurprijs").value);
        aantalList.push(document.getElementById("formUren").value);
        print()
    }

        /*print de lijnen verticaal uit*/
    function print(){
        for (var j =0;j<3;j++){
            document.getElementById(idlist[j]).getElementsByTagName("UL")[0].innerHTML="";
            for (var i = 0; i<omschList.length;i++){
                var li = document.createElement("LI");
                if (j==0){
                    li.innerHTML = (idlist[j+3][i]+"<object align=\"right\" onclick=\"verwijder("+i+")\"><u>verwijder</u></object>");
                } else {
                    li.innerHTML = (idlist[j+3][i]);
                }
                document.getElementById(idlist[j]).getElementsByTagName("UL")[0].appendChild(li);
            }
        }
        /*bereken lijntotaal*/
        document.getElementById("lijntotaal").getElementsByTagName("UL")[0].innerHTML=""
        var subtotaal=0;
        for (var i=0; i<uurprList.length;i++){
            var totaal = uurprList[i]*aantalList[i];
            subtotaal +=totaal;
            var li = document.createElement("LI");
            li.innerHTML=totaal;
            document.getElementById("lijntotaal").getElementsByTagName("UL")[0].appendChild(li);
        }
        /*subtotaal en btwtotaal wegschrijven*/
        document.getElementById("subtotaal").innerHTML=subtotaal;
        document.getElementById("btwbedrag").innerHTML=(subtotaal*0.21);
        document.getElementById("totaal").innerHTML=(subtotaal*1.21);
    }

    function verwijder(index){
        for (var i=0;i<3;i++){
            idlist[i+3].splice(index, 1);
        }
        print();
    }
} );

    })(jQuery);

And the HTML code that worked

    <body>




    <div class="page">
    <header class="header">

</header>

<div role="main" class="cf">
  <div class="container" id="factuur">
    <section id="header">
      <div class="col-sm-8">
        <h1>Factuur</h1>
      </div>
      <div class="col-sm-8">Factuur nr. 1</div>
      <div class="col-sm-6">

        <div>Naam onderneming<br />
        Straatnaam nr<br />
      Postcode Gemeente<br />
    BE 0123 456 789</div>
      </div>
      <div class="col-sm-6">
        <div>Naam Klant<br />
        Straatnaam nr<br />
      Postcode Gemeente<br />
      BE 0123 456 789</div>
    </div>
    </section>
    <section id="content-header">
      <div class="col-sm-6">Omschrijving</div>
      <div class="col-sm-2">Uurprijs</div>
      <div class="col-sm-2">Aantal</div>
      <div class="col-sm-2">Totaal</div>
    </section>
    <section id="content">
      <div class="col-sm-6" id="omschrijving"><ul></ul></div>
      <div class="col-sm-2" id="uurprijs"><ul></ul></div>
      <div class="col-sm-2" id="aantal"><ul></ul></div>
      <div class="col-sm-2" id="lijntotaal"><ul></ul></div>
    </section>
    <section id="totalen">
      <div class="col-sm-offset-7 col-sm-3 text-right">Subtotaal</div>
      <div class="col-sm-2" id="subtotaal"></div>

      <div class="col-sm-offset-7 col-sm-3 text-right">BTW</div>
      <div class="col-sm-2" id="btw">21 %</div>

      <div class="col-sm-offset-7 col-sm-3 text-right">BTW Bedrag</div>
      <div class="col-sm-2" id="btwbedrag"></div>

      <div class="col-sm-offset-7 col-sm-3 text-right" style="border-top:1px solid black;">Totaal</div>
      <div class="col-sm-2" id="totaal" style="border-top:1px solid black;"></div>
    </section>
    <section id="factuurknop">
      <button type="button" class="btn btn-primary btn-lg" data-toggle="modal" data-target="#factuurModal">
        Voeg een factuurlijn toe
      </button>

    </section>
  </div>
</div>


</div>

<!-- Modal -->
<div class="modal fade" id="factuurModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
  <div class="modal-dialog" role="document">
    <div class="modal-content">
      <div class="modal-header">
        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
        <h4 class="modal-title" id="myModalLabel">Voeg een factuur item toe</h4>
      </div>
      <form>
      <div class="modal-body">
          <input style="width:30%" type="text" name="formOmschrijving" id="formOmschrijving" placeholder="Omschrijving">
          <input style="width:30%" type="text" name="formUurprijs" id="formUurprijs" placeholder="Uurprijs">
          <input style="width:30%" type="text" name="formUren" id="formUren" placeholder="uren">
      </div>
      <div class="modal-footer">
        <button type="button" id="factuurFormSend" class="btn btn-primary">Verzenden</button>
      </div>
      </form>
    </div>
  </div>
</div>

<script>
    document.getElementById("factuurFormSend").onclick = addLine;
      var omschList=[];
      var uurprList=[];
      var aantalList=[];
      var idlist=["omschrijving",
                  "uurprijs",
                  "aantal",
                  omschList,
                  uurprList,
                  aantalList]
    function addLine(){
        omschList.push(document.getElementById("formOmschrijving").value);
        uurprList.push(document.getElementById("formUurprijs").value);
        aantalList.push(document.getElementById("formUren").value);
        print()
    }

        /*print de lijnen verticaal uit*/
    function print(){
        for (var j =0;j<3;j++){
            document.getElementById(idlist[j]).getElementsByTagName("UL")[0].innerHTML="";
            for (var i = 0; i<omschList.length;i++){
                var li = document.createElement("LI");
                if (j==0){
                    li.innerHTML = (idlist[j+3][i]+"<object align=\"right\" onclick=\"verwijder("+i+")\"><u>verwijder</u></object>");
                } else {
                    li.innerHTML = (idlist[j+3][i]);
                }
                document.getElementById(idlist[j]).getElementsByTagName("UL")[0].appendChild(li);
            }
        }
        /*bereken lijntotaal*/
        document.getElementById("lijntotaal").getElementsByTagName("UL")[0].innerHTML=""
        var subtotaal=0;
        for (var i=0; i<uurprList.length;i++){
            var totaal = uurprList[i]*aantalList[i];
            subtotaal +=totaal;
            var li = document.createElement("LI");
            li.innerHTML=totaal;
            document.getElementById("lijntotaal").getElementsByTagName("UL")[0].appendChild(li);
        }
        /*subtotaal en btwtotaal wegschrijven*/
        document.getElementById("subtotaal").innerHTML=subtotaal;
        document.getElementById("btwbedrag").innerHTML=(subtotaal*0.21);
        document.getElementById("totaal").innerHTML=(subtotaal*1.21);
    }

    function verwijder(index){
        for (var i=0;i<3;i++){
            idlist[i+3].splice(index, 1);
        }
        print();
    }
} );
</script>

Place your functions in the global scope if you want to assign the click events inline. Not in the load event handler.

Better would be is not to add the click event inline but use event delegation for it. jQuery has great tools for this. Also your code is a weird combination between plain javascript and jQuery functions. It will work, but in my opinion it's better to stay to one style for readability

(function($) {

  $(document).ready(function() {

    /* VIEWPORT FIXES (http://timkadlec.com/2013/01/windows-phone-8-and-device-width/) */
    if (navigator.userAgent.match(/IEMobile\/10\.0/)) {
      var msViewportStyle = document.createElement('style');
      msViewportStyle.appendChild(
        document.createTextNode(
          '@-ms-viewport{width:auto!important}'
        )
      );
      document.querySelector('head').appendChild(msViewportStyle);
    }    

    document.getElementById("factuurFormSend").onclick = addLine;

  });

  function addLine() {
    omschList.push(document.getElementById("formOmschrijving").value);
    uurprList.push(document.getElementById("formUurprijs").value);
    aantalList.push(document.getElementById("formUren").value);
    print()
  }
})(jQuery);

var omschList = [];
var uurprList = [];
var aantalList = [];   
var idlist = ["omschrijving",
  "uurprijs",
  "aantal",
  omschList,
  uurprList,
  aantalList
]

/*print de lijnen verticaal uit*/
function print() {
  for (var j = 0; j < 3; j++) {
    document.getElementById(idlist[j]).getElementsByTagName("UL")[0].innerHTML = "";
    for (var i = 0; i < omschList.length; i++) {
      var li = document.createElement("LI");
      if (j == 0) {
        li.innerHTML = (idlist[j + 3][i] + "<object align=\"right\" onclick=\"verwijder(" + i + ")\"><u>verwijder</u></object>");
      } else {
        li.innerHTML = (idlist[j + 3][i]);
      }
      document.getElementById(idlist[j]).getElementsByTagName("UL")[0].appendChild(li);
    }
  }
  /*bereken lijntotaal*/
  document.getElementById("lijntotaal").getElementsByTagName("UL")[0].innerHTML = ""
  var subtotaal = 0;
  for (var i = 0; i < uurprList.length; i++) {
    var totaal = uurprList[i] * aantalList[i];
    subtotaal += totaal;
    var li = document.createElement("LI");
    li.innerHTML = totaal;
    document.getElementById("lijntotaal").getElementsByTagName("UL")[0].appendChild(li);
  }
  /*subtotaal en btwtotaal wegschrijven*/
  document.getElementById("subtotaal").innerHTML = subtotaal;
  document.getElementById("btwbedrag").innerHTML = (subtotaal * 0.21);
  document.getElementById("totaal").innerHTML = (subtotaal * 1.21);
}

function verwijder(index) {
  for (var i = 0; i < 3; i++) {
    idlist[i + 3].splice(index, 1);
  }
  print();
}

If you want to be able to delete an object on click you could do this with jQuery and event delegation pretty easily.

 //Wait till the initial DOM loading is done $(document).ready(function() { //Attach an event handler to the click event to the button the adds a new object $("#addObject").on('click', function() { $('#staticParent').append("<div class='deletableObject'>deletable on click</div>") }); //Attach event delegation from the element with id staticParent to place a function on //the click event of all elements with the class deletableObject inside the element with //id staticParent. Because it's event delegation it will work also for elements with this //class the will be added later dynamicly. $("#staticParent").on('click', '.deletableObject', function() { $(this).remove(); }); }); 
 <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script> <div id="staticParent" style="min-height: 100px"> <div class="deletableObject">deletable on click</div> </div> <button id="addObject">Add</button> 

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM