CodingForums.com

CodingForums.com (http://www.codingforums.com/index.php)
-   JavaScript programming (http://www.codingforums.com/forumdisplay.php?f=2)
-   -   Error: this.basket[index].setCondition is not a function (http://www.codingforums.com/showthread.php?t=284323)

Kuan 12-18-2012 06:30 AM

Error: this.basket[index].setCondition is not a function
 
Hi there,

I have designed text fields which allow user to enter the with single/multi rows
data into database. I have 2 javascript files which are written in the same way, just different variable and function name. But one of them is not working.

Below is my scripts:-

Code:

/**
 * Broswer class.
 *
 */
function Browser(){
  this.dom  = document.getElementById?1:0;
  this.ie4  = (document.all && !this.dom)?1:0;
  this.ns4  = (document.layers && !this.dom)?1:0;
  this.ns6  = (this.dom && !document.all)?1:0;
  this.ie5  = (this.dom && document.all)?1:0;
  this.ok  = this.dom || this.ie4 || this.ns4;
  this.platform = navigator.platform;
}
var browser = new Browser();

/**
 * advSearchTable Class
 *
 */
function detailTable(nameCond)
{
  this.nameCond  = nameCond;
  this.basket = new Array();
  this.segObj = document.getElementById('detailTable');
}

detailTable.prototype.select = function(conditionSelected)
{
        var i=this.basket.length;
        this.basket[i]=new Segment(conditionSelected);
        this.renderDetailTable();
}

detailTable.prototype.remove = function(index)
{
  this.basket[index].deleteSegment();
  this.renderDetailTable();
}

detailTable.prototype.changeValue = function(index, field, value)
{
  this.basket[index].setCondition(value);
  this.renderDetailTable();
}
detailTable.prototype.renderDetailTable = function()
{
  var unit        = 0;
  var counter    = 0;
  var tableNumber = 1;
  var no          = 1;
  var segTable    = "";
 
  segTable += "<table>";
 
  for(i=0; i<this.basket.length; i++) {
    var seg=this.basket[i];
                if(seg.active=="No")
                        continue;
                unit++;
   
    var conditionSelected = seg.conditionSelected
    var condition        = "condition:"+counter;
   
    if (no%2==0) segTable += "<tr>"; else segTable += "<tr class='trAlt2'>";
    segTable += "<td>"+no+".</td>";
    segTable += "<td nowrap width='90%'>";
    segTable += '<textarea name="'+condition+'" id="'+condition+'" style="height:40px;" size = "95" maxlength = "95" onChange="detailTable.changeValue('+i+',\'condition\',this.value);">'+conditionSelected+'</textarea></td>';
    segTable += "<td><input type=\"button\" name=\"Remove\" value=\"X\" onClick=\"detailTable.remove('"+i+"', false);\" class=\"remove\"></td>";
    segTable += '</tr>';
    segTable += ''
    tableNumber++;
    counter++;
    no++;
  }
  segTable += "</table><br>"; 
  $("#hidRowCount").val(counter);

  this.segObj.innerHTML=((unit>0)?segTable:"");
}

function Segment(conditionSelected)
{
        this.active            = "Yes";
  this.conditionSelected = conditionSelected;
}

Segment.prototype.deleteSegment = function()
{
        this.active = "No";
}

Segment.prototype.setCondition = function(value)
{
        this.conditionSelected = value;
}

Error message is shown in the Title. The error pointed to the red highlighted in the line above.
Please advise.

Thanks

Philip M 12-18-2012 07:19 AM

Code:

this.ie4  = (document.all && !this.dom)?1:0;
  this.ns4  = (document.layers && !this.dom)?1:0;
  this.ns6  = (this.dom && !document.all)?1:0;
  this.ie5  = (this.dom && document.all)?1:0;

Those browsers have been one with Nineveh and Tyre for very many years. :eek:

It is your responsibility to die() if necessary….. - PHP Manual

Logic Ali 12-18-2012 07:37 PM

Then do something to find out why:
Code:

detailTable.prototype.changeValue = function(index, field, value)
{
  alert( typeof this.basket[index].setCondition  );
  this.basket[index].setCondition(value);
  this.renderDetailTable();
}

If you're writing object-orientated code, don't ruin it by creating global variables:

Code:

for( var i=0; i<this.basket.length; i++) {

Old Pedant 12-19-2012 05:41 AM

Quote:

Originally Posted by Philip M (Post 1300728)
Code:

this.ie4  = (document.all && !this.dom)?1:0;
  this.ns4  = (document.layers && !this.dom)?1:0;
  this.ns6  = (this.dom && !document.all)?1:0;
  this.ie5  = (this.dom && document.all)?1:0;

Those browsers have been one with Nineveh and Tyre for very many years. :eek:

On top of that, it's not even accurate.

FireFox, Safari, and Chrome (I think) will all show up as ns6.

It's hard to imagine any more pointless code in today's market. Or, for that matter, at any time since about 2001 or so.

The good part is that, after shoving in that junk code, it does not appear that he actually uses it any place.

Old Pedant 12-19-2012 05:46 AM

Quote:

Originally Posted by Logic Ali (Post 1300860)
Then do something to find out why:
Code:

detailTable.prototype.changeValue = function(index, field, value)
{
  alert( typeof this.basket[index].setCondition  );
  this.basket[index].setCondition(value);
  this.renderDetailTable();
}


Ummm...I will bet that will just alert null.

Possibly better:
Code:

detailTable.prototype.changeValue = function(index, field, value)
{
    alert( "this: " + typeof this );
    alert( "this.basket: " + typeof this.basket );
    alert( "index: " + index + " vs. this.basket.length: " + this.basket.length );
    alert( "this.basket[index]: " + typeof this.basket[index] );
    ...
}

Though of course much better than all that gobbledy-gook would be to simply use a debugger and inspect the elements to see what's what.

alert( typeof this.basket[index].setCondition );


All times are GMT +1. The time now is 12:48 AM.

Powered by vBulletin®
Copyright ©2000 - 2013, Jelsoft Enterprises Ltd.