16

Is it possible to use onchange event in a <div>?

Because my <div> changes its text inside.

Can I do something like this?

<div id="name" onchange="calculateTotal();"></div> 
pimvdb
  • 151,816
  • 78
  • 307
  • 352
  • Does the user change the text or do you do it programmatically? – pimvdb Jul 13 '11 at 08:34
  • 2
    then it doesn't change, it is initialized – Sascha Galley Jul 13 '11 at 08:35
  • 1
    @Rafael Santos: When PHP updates it, do you do it through AJAX or through a new page request? – pimvdb Jul 13 '11 at 08:35
  • 1
    It can't be changed with PHP, it is either changed by Javascript (PHP -> Ajax -> Javascript) or pregenerated by PHP. – bezmax Jul 13 '11 at 08:36
  • 7
    [Specification](http://www.w3.org/TR/html4/interact/scripts.html) says: *The onchange event occurs when a control loses the input focus and its value has been modified since gaining focus. This attribute applies to the following elements: INPUT, SELECT, and TEXTAREA.* So no, it is not possible like this. Suggestion: When you change the content, compare the new value against the old one and perform the action. – Felix Kling Jul 13 '11 at 08:37
  • Thanks everybody, but how can I do that? – Rafael Morais dos Santos Jul 13 '11 at 08:38
  • @Rafael Santos: Well, in case you do it with Ajax - you should trigger your change event manually in Ajax callback function. What framework do you use for AJAX? And could you paste your AJAX code and update your question with new info? – bezmax Jul 13 '11 at 08:38

8 Answers8

26

No; the onchange attribute is only applicable to form field elements (input, select, textarea, etc).

4

Since you say you're using AJAX, why not execute the function when you update the text. I'm not sure if you use any library, but in case it's jQuery just do:

 $.ajax({ ...,
          success: function() {
               ... other things ...
               ... setting div text ...
               calculateTotal();
          }
       });
pimvdb
  • 151,816
  • 78
  • 307
  • 352
4

As you are changing the text yourself, just call calculateTotal when the AJAX call completes and the text has been placed in the element.

Example (using jQuery):

$('#name').load('GetFragment.php', calculateTotal);
Guffa
  • 687,336
  • 108
  • 737
  • 1,005
3

It's a bit over most webdesigners paygrade, but it's not any problem to monitor a div using the dom. It's also pure vanilla javascript, so nothing required.

The most easy way to show it is with a example. The Div is editable so just click on it and type something and your javascript console will show what is going on. (if you don't know your way around the javascript debugger this might be to hard for you, so just learn it ;) )

<html>
<head>
<script>
        // Run the code once the DOM is created, think jquery $(function(){}); but HTML5
        document.addEventListener("DOMContentLoaded", function () {
            const commandlineDiv = document.getElementById('commandline');
            function mutationCallback(mutationsList, observer) {
                console.log(mutationsList);
                console.log(observer);
                for (const mutation of mutationsList) {
                    if (mutation.type === 'childList') {
                        console.log('A child node has been added or removed.');
                    } else if (mutation.type === 'attributes') {
                        console.log('The ' + mutation.attributeName + ' attribute was modified.');
                    } else {
                        console.log('mutation.type: ' + mutation.type);
                        console.log('New value ' + JSON.stringify(mutation.target.data));
                    }
                }
            }
            // Create an observer instance linked to the callback function
            const observer = new MutationObserver(mutationCallback);
            // What to observe
            const mutationConfig = { attributes: true, childList: true, subtree: true, characterData: true };
            observer.observe(commandlineDiv, mutationConfig);
        })

</script>
</head>
<body>
<div id="commandline" contentEditable="true">commandline</div>
</body>
</html>
Griffin
  • 785
  • 5
  • 13
3

You can use 'onInput' instead of 'onChange'.

<div className="inputDiv" contenteditable="true" onInput={(e) => { console.log(e.currentTarget.textContent) }} />

Check the console log with Chrome Developer Tools (F12):

enter image description here

References: https://stackoverflow.com/a/52614631/8706661

HellJosun
  • 129
  • 1
  • 10
1

Onchange is called when user changed input value. So answer is yes, but it will have no effect. I assume you change content programmatically, so add simple code which will call this function

SergeS
  • 11,533
  • 3
  • 29
  • 35
0

You can use onblur event. Onblur event working on table,div etc.

<div id="name" onblur="calculateTotal();"></div>
Sumit Kumar Gupta
  • 2,132
  • 1
  • 22
  • 21
0

Change your div to a textarea or button or input You can't use onchange in div

djadweb
  • 29
  • 2