1

我一直试图将在 d6 中完美运行的 javascript 文件转换为 d7,我一直在搜索有关 drupal 行为的信息,但似乎找不到解决此问题的正确方法。

以下脚本为 (jQuery) 之前的右括号返回了一个意外的标记错误 )。

(function($){

var VAT = 0.2;
var QUANTITY_SUFFIX = "field-po-quantity";
var PRICE_SUFFIX = "field-po-price";
var SUBTOTAL_SUFFIX = "field-po-item-st";
var VAT_SUFFIX = "field-po-item-vat";
var TOTAL_SUFFIX = "field-po-item-total";

var quantityFields;
var priceFields;
var fieldsValid = false;

function isNumber(value) {
  return    !isNaN(parseFloat(value)) &&
        isFinite(value);
}

function validValue(value) {
  return    isNumber(value) &&
      parseFloat(value) > 0;
}

function addCommas(nStr) {
  nStr += '';
  var x = nStr.split('.');
  var x1 = x[0];
  var x2 = x.length > 1 ? '.' + x[1] : '';
  var rgx = /(\d+)(\d{3})/;
  while (rgx.test(x1)) {
    x1 = x1.replace(rgx, '$1' + ',' + '$2');
  }
return x1 + x2;
}   

function decimalise(value) {
  if (isNumber(value)) {
    var numericValue = parseFloat(value);
    return numericValue.toFixed(2);
  }
}

function validateFields() {
  var fieldsValid = true;
  var allFields = new Array();

  quantityFields = jQuery('input[id*="' + QUANTITY_SUFFIX + '"]');
  priceFields = jQuery('input[id*="' + PRICE_SUFFIX + '"]');

  allFields.push.apply(allFields, quantityFields);
  allFields.push.apply(allFields, priceFields);

  for (i=0; i<allFields.length; i++) {
    var field = allFields[i];
    var valueString = field.value;
    if (!validValue(valueString)) {
      field.style.borderStyle="solid";
      field.style.border="inset 1px red";
      fieldsValid = false;
    } else {
      field.style.borderStyle="none";
    }
  }
  this.fieldsValid = fieldsValid;
}

jQuery(document).click(function() {
  validateFields();
  if (fieldsValid) {
    var subTotalSum = 0;
    var vatSum = 0;
    var totalSum = 0;
    jQuery('#field-po-items-values tbody tr:not(.content-multiple-removed-row)').each(function(){
      var quantityString = jQuery(this).find('input[id*="' + QUANTITY_SUFFIX + '"]').val();
      var numericQuantity = decimalise(quantityString);
      var priceString = jQuery(this).find('input[id*="' + PRICE_SUFFIX + '"]').val();
      var numericPrice = decimalise(priceString);
      var subtotal = parseFloat(numericPrice * numericQuantity);
      jQuery(this).find('input[id*="' + SUBTOTAL_SUFFIX + '"]').val(addCommas(decimalise(subtotal)));
      var vat = subtotal * VAT;
      jQuery(this).find('input[id*="' + VAT_SUFFIX + '"]').val(addCommas(decimalise(vat)));
      var total = subtotal + vat;
      jQuery(this).find('input[id*="' + TOTAL_SUFFIX + '"]').val(addCommas(decimalise(total)));
      subTotalSum += subtotal;
      vatSum += vat;
      totalSum += parseFloat(total);
    });
    jQuery('input[id*="edit-field-po-subtotal"]').val(addCommas(decimalise(subTotalSum)));
    jQuery('input[id*="edit-field-po-vat"]').val(addCommas(decimalise(vatSum)));
    jQuery('input[id*="edit-field-po-total"]').val(addCommas(decimalise(totalSum)));
  }
}

})(jQuery);

该文件是从 template.php 调用的,使用插入文件顶部的 drupal_add_js,而不是在预处理或任何东西下。

我知道 jQuery(document).click(function() { 也可能导致问题,最终可能是意外令牌错误的原因?

先感谢您

4

1 回答 1

1

我不知道你的代码是否正确,但强烈建议在 Drupal>7 中这样使用 JavaScript:

(function ($) {
    Drupal.behaviors.yourFunction = {
        attach: function(context, settings) {

            var VAT = 0.2;
            var QUANTITY_SUFFIX = "field-po-quantity";
            var PRICE_SUFFIX = "field-po-price";
            var SUBTOTAL_SUFFIX = "field-po-item-st";
            var VAT_SUFFIX = "field-po-item-vat";
            var TOTAL_SUFFIX = "field-po-item-total";

            var quantityFields;
            var priceFields;
            var fieldsValid = false;

            function isNumber(value) {
                return    !isNaN(parseFloat(value)) &&
                    isFinite(value);
            }

            function validValue(value) {
                return    isNumber(value) &&
                    parseFloat(value) > 0;
            }

            function addCommas(nStr) {
                nStr += '';
                var x = nStr.split('.');
                var x1 = x[0];
                var x2 = x.length > 1 ? '.' + x[1] : '';
                var rgx = /(\d+)(\d{3})/;
                while (rgx.test(x1)) {
                    x1 = x1.replace(rgx, '$1' + ',' + '$2');
                }
                return x1 + x2;
            }

            function decimalise(value) {
                if (isNumber(value)) {
                    var numericValue = parseFloat(value);
                    return numericValue.toFixed(2);
                }
            }

            function validateFields() {
                var fieldsValid = true;
                var allFields = new Array();

                quantityFields = $('input[id*="' + QUANTITY_SUFFIX + '"]');
                priceFields = $('input[id*="' + PRICE_SUFFIX + '"]');

                allFields.push.apply(allFields, quantityFields);
                allFields.push.apply(allFields, priceFields);

                for (i=0; i<allFields.length; i++) {
                    var field = allFields[i];
                    var valueString = field.value;
                    if (!validValue(valueString)) {
                        field.style.borderStyle="solid";
                        field.style.border="inset 1px red";
                        fieldsValid = false;
                    } else {
                        field.style.borderStyle="none";
                    }
                }
                this.fieldsValid = fieldsValid;
            }

            $(document).click(function() {
                validateFields();
                if (fieldsValid) {
                    var subTotalSum = 0;
                    var vatSum = 0;
                    var totalSum = 0;
                    $('#field-po-items-values tbody tr:not(.content-multiple-removed-row)').each(function(){
                        var quantityString = $(this).find('input[id*="' + QUANTITY_SUFFIX + '"]').val();
                        var numericQuantity = decimalise(quantityString);
                        var priceString = $(this).find('input[id*="' + PRICE_SUFFIX + '"]').val();
                        var numericPrice = decimalise(priceString);
                        var subtotal = parseFloat(numericPrice * numericQuantity);
                        $(this).find('input[id*="' + SUBTOTAL_SUFFIX + '"]').val(addCommas(decimalise(subtotal)));
                        var vat = subtotal * VAT;
                        $(this).find('input[id*="' + VAT_SUFFIX + '"]').val(addCommas(decimalise(vat)));
                        var total = subtotal + vat;
                        $(this).find('input[id*="' + TOTAL_SUFFIX + '"]').val(addCommas(decimalise(total)));
                        subTotalSum += subtotal;
                        vatSum += vat;
                        totalSum += parseFloat(total);
                    });
                    $('input[id*="edit-field-po-subtotal"]').val(addCommas(decimalise(subTotalSum)));
                    $('input[id*="edit-field-po-vat"]').val(addCommas(decimalise(vatSum)));
                    $('input[id*="edit-field-po-total"]').val(addCommas(decimalise(totalSum)));
                }
            }


        }
    };
})(jQuery);

有关 Drupal 行为的更多信息:

于 2012-07-23T10:02:23.733 回答