10

i'm using color picker from http://jscolor.com/

i'm trying to attach it to some dynamic inputs, but to no avail. dynamic inputs in terms of, on page load the input doesn't exist, only after the user click on something the input will become available. for example, I have a rows of data, and each row has different background color. this row of data are loaded using ajax. at the end of each row, there's an edit button. by clicking the edit button, it will display an input text box for the clicked row. I want to call the jscolor picker when the user clicks on the input text box. how can I do this?

thanks

imin
  • 4,504
  • 13
  • 56
  • 103
  • Very simillar problem was introduced here: https://stackoverflow.com/questions/43174801/how-to-reinitialize-a-script-in-an-html-document/56521977#56521977 and this one acutally helped in my case of dynamic input. – Volmarg Reiso Jun 10 '19 at 07:09

5 Answers5

30

For some reason jscolor.init() did not work for me, and looking at the code I called

jscolor.installByClassName("jscolor");

function.

So...

$(document).ready(function() {
  jscolor.installByClassName("jscolor");
});

Hope it helps

Alejandro Díaz
  • 430
  • 4
  • 10
8

I just had this problem too but luckily it's easy to fix. You need to (re)init jscolor after you have dynamically created your inputs:

jscolor.init()
BStone
  • 220
  • 2
  • 9
  • Simplest solution, just we weary of calling it while you're still generating inputs as it could slow things down. – deadboy Jul 02 '14 at 15:26
  • 2
    This is not working for me, I get an error saying jscolor.init is not a function :/ Please elaborate if anyone knows how this works now, until then I reset jscolor and load the script again with Jquery... window.jscolor = undefined; $.getScript("../Scripts/jscolor.min.js", function () { }); – mathkid91 Jun 15 '16 at 17:25
2

This helped me

<script>
 $(document).on('click', '#myPickerId', function () {
    var obj = $(this)[0];
    if (!obj.hasPicker) {
        var picker = new jscolor.color(obj, {});  //
        obj.hasPicker = true;
        picker.showPicker();
    }
});    
</script>

In my case, the picker control was dynamic because it is inside Knockout.js 'with' statement which hides and recreates the picker when it needs.

Maxim Eliseev
  • 3,248
  • 4
  • 29
  • 35
2

Got the same problem upon adding input fields dynamically

Managed to make it work by calling jscolor.install();

PS: jscolor v2.4.5

0

As of 2020, the original problem should be solvable by dynamically creating an input element, and then calling new jscolor(input). Using JQuery (you could use vanilla JS as well):

var color_input = $('<input class="jscolor" spellcheck="false">');
new jscolor(color_input[0]);

This will make the popup picker appear on click, and everything appears to work just fine. However, you cannot manipulate it programmatically. To set the color using the objects above, you would normally use a method like: color_input[0].jscolor.fromString("#B7B7B7"). But that will fail for dynamically created objects, as color_input[0].jscolor is undefined. I believe this is a bug in Jscolor (and probably very easily solvable), as the missing object is actually available with color_input[0]._jscLinkedInstance. So you can just set the object yourself on instantiation with:

var color_input = $('<input class="jscolor" spellcheck="false">');
color_input[0].jscolor = new jscolor(color_input[0]);

And then everything looks to be working as expected. Hopefully this helps someone else that comes across this answer page as I did.

DaveTheScientist
  • 3,299
  • 25
  • 19