分配期间的JavaScript字符串连接

时间:2015-11-13 18:42:54

标签: javascript

我正在构建一组按钮,每个按钮都将分配给一个变量。在我的循环中,我有一些id,我想要附加到每个按钮的id属性:

var test = '<button id="myButton_" class="myButtonsClass" type="button">testButton</button>';

我希望它看起来像button id="myButton_123"

2 个答案:

答案 0 :(得分:4)

避免使用长字符串,并使用DOM本身提供给您的方法。创建元素并操纵其内容/属性并不困难:

// This will hold our buttons, so we aren't thrashing the DOM
var fragment = document.createDocumentFragment();

// Lets cycle over a collection of ids
[ 23, 57, 92 ].forEach(function ( id ) {

    // Create a button, and get ready to manipulate it
    var button = document.createElement( "button" );

    // Set a few properties, and the content
    button.id = "myButton_" + id;
    button.textContent = "Test Button";
    button.className = "myButtonsClass";

    // Push this button into the fragment
    fragment.appendChild( button );    

});

// Now we touch the DOM once by adding the fragment
document.body.appendChild( fragment );

在现代ES6 +环境中,您可以在situe 插值中使用的模板文字字符串:

var id = "73868CB1848A216984DCA1B6B0EE37BC";
var button = `<button id='myButton${ id }'>Click Me</button>`;

话虽如此,我仍然鼓励你将任务分解为更小,更易消耗的部分,并使用DOM apis来构建元素。

答案 1 :(得分:0)

您可以使用replace功能:

#include "stdlib.h"
#include "string.h"

#ifndef SIZE_MAX
#define SIZE_MAX ((size_t)-1)
#endif

#undef MAX
#define MAX(a, b) ((a) > (b) ? (a) : (b))

struct st_char_vector {
  char *buf;
  size_t capacity;
  size_t length;
};

/*@ predicate valid_char_vector(struct st_char_vector *vec) =
  @   \valid_read(vec) &&
  @   vec->capacity > 0 &&
  @   \valid(vec->buf + (0..vec->capacity - 1)) &&
  @   vec->length <= vec->capacity;
  @*/

//@ ghost extern int mem_full;

/*@ requires valid_char_vector(vec);
  @ requires new_capacity >= vec->capacity;
  @ assigns mem_full;
  @ ensures valid_char_vector(vec);
  @ ensures \old(vec->length) == vec->length;
  @ ensures valid_char_vector(vec);
  @ ensures memcmp{Pre,Post}(\at(vec->buf,Pre), vec->buf, vec->length) == 0;
  @ behavior err:
      assumes mem_full;
  @   ensures !\result;
  @   ensures \old(vec->buf) == vec->buf;
  @   ensures \old(vec->capacity) == vec->capacity;
  @ behavior ok:
      assumes !mem_full;
  @   ensures \result;
  @   ensures vec->capacity >= new_capacity;
  @ complete behaviors;
  @ disjoint behaviors;
  @*/
static int char_vector_reallocate(struct st_char_vector *vec, size_t new_capacity);

/*@ requires valid_char_vector(vec);
  @ requires \valid_read(str + (0..str_length - 1));
  @ requires string_separated_from_extra_capacity:
  @   \separated(str + (0..str_length - 1), vec->buf + (vec->length..vec->capacity - 1));
  @ ensures valid_char_vector(vec);
  @ ensures old_content_unchanged: memcmp{Pre,Post}(\at(vec->buf,Pre), vec->buf, \old(vec->length)) == 0;
  @ ensures \forall integer i; 0 <= i && i < \old(vec->length) ==> \old(vec->buf[i]) == vec->buf[i];
  @ behavior err:
      assumes vec->capacity+str_length>SIZE_MAX || 
      (vec->length+str_length>vec->capacity && mem_full);
  @   ensures !\result;
  @   ensures buf_unchanged: \old(vec->buf) == vec->buf;
  @   ensures capacity_unchanged: \old(vec->capacity) == vec->capacity;
  @   ensures length_unchanged: \old(vec->length) == vec->length;
  @ behavior ok:
      assumes vec->capacity+str_length<=SIZE_MAX && 
      (vec->length+str_length<=vec->capacity || !mem_full);
  @   ensures \result;
  @   ensures str_length_added_to_length: vec->length == \old(vec->length) + str_length;
  @   ensures string_appended: memcmp{Post,Post}(vec->buf + \at(vec->length, Pre), str, str_length) == 0;
  @ complete behaviors;
  @ disjoint behaviors;
  @*/
int char_vector_append(struct st_char_vector *vec, const char *str, size_t str_length) {
  if (SIZE_MAX - str_length < vec->capacity) {
    return 0;
  }

  if (vec->capacity < (vec->length + str_length)) {
    if (!char_vector_reallocate(vec, vec->capacity + str_length)) {
      return 0;
    }
  }
   memcpy(vec->buf + vec->length, str, str_length);
  vec->length += str_length;

  return 1;
}